2010-09-30 4 views
0

Je question au sujet de cette requête, un peu plus lent pour moi :(recherche lente de minimum dans la liste des valeurs maximales avec sql avec clause

Mon problème: Je cherche le minimum tiques dans une liste qui contient . chaque maximum de chaque liste de tiques par graines

=> égal à min (max (seed1), max (seed2), max (3 graines), etc.)

PS: chaque graine contient ~ 10 000 rows (1 row = 1 ticks) PS2: J'ai une table contenant toutes les données (ce n'est pas une bonne solution, je sais, mais je n'ai pas le choix en ce moment de mon projet.) La simulation contient des millions de lignes, hum .. comme 40 M:/ PS3: J'avais index sur v_seed et v_exp.

temps pour exécuter cette requête est ~ 135 secondes, il est très lent :(

 
WITH summary AS (SELECT v_ticks,v_seed, ROW_NUMBER() OVER(PARTITION BY v_seed 
ORDER BY v_ticks DESC) as rk FROM simulations 
WHERE v_exp=23 AND v_seed IN (2133836778, -2061794068, 1260042744, -1324330098, -423279216, -685846464, 142959438, -1154715079, 1062336798,-624140595, -922352011, -613647601, -330177159, 1945002173, 131053356, -216538235, -636982783, 979930868, 321237028, -1103129161, 476235295, -1916604834, -54027108, 17850135, -60658084)) 
SELECT min(s.v_ticks) 
FROM summary s WHERE s.rk = 1 

MISE À JOUR 1: EXPLIQUER INFORMATIONS

Aggregate (cost=6327697.46..6327697.47 rows=1 width=4) 
    CTE summary 
    -> WindowAgg (cost=5302458.61..5784782.09 rows=24116174 width=12) 
     -> Sort (cost=5302458.61..5362749.05 rows=24116174 width=12) 
       Sort Key: simulations.v_seed, simulations.v_ticks 
       -> Bitmap Heap Scan on simulations (cost=415238.16..1933251.42 rows=24116174 width=12) 
         Recheck Cond: (v_seed = ANY ('{2133836778,-2061794068,1260042744,-1324330098,-423279216,-685846464,142959438,-1154715079,1062336798,-624140595,-922352011,-613647601,-330177159,1945002173,131053356,-216538235,-636982783,979930868,321237028,-1103129161,476235295,-1916604834,-54027108,17850135,-60658084}'::bigint[])) 
         Filter: (v_exp = 23)" 
          -> Bitmap Index Scan on index_seed (cost=0.00..409209.12 rows=25752303 width=0) 
          Index Cond: (v_seed = ANY ('{2133836778,-2061794068,1260042744,-1324330098,-423279216,-685846464,142959438,-1154715079,1062336798,-624140595,-922352011,-613647601,-330177159,1945002173,131053356,-216538235,-636982783,979930868,321237028,-1103129161,476235295,-1916604834,-54027108,17850135,-60658084}'::bigint[])) 
    -> CTE Scan on summary s (cost=0.00..542613.92 rows=120581 width=4) 
     Filter: (rk = 1) 

Si vous avez une idée d'optimiser cette requête, c'est cool :) Thx!

+0

Est-ce que les simulations ont un index clusterisé? –

+0

Que dit le planificateur de requêtes? – vol7ron

+0

Aucun index clusterisé, seul index simple sur colum v_seed et v_xp – reyman64

Répondre

1

Assurez-vous que la table Simulations a un index cluster sur v_seed et essayez ceci:

CREATE TABLE #Seeds(seed int) 

INSERT #Seeds 
SELECT 2133836778 UNION 
SELECT -2061794068 UNION 
... 
SELECT -60658084 

WITH summary AS 
( 
SELECT v_ticks,v_seed, ROW_NUMBER() OVER(PARTITION BY v_seed ORDER BY v_ticks DESC) as rk 
FROM simulations sim 
    INNER JOIN 
     #Seeds seeds 
    ON sim.v_seed = seeds.seed 

WHERE v_exp =23 
) 
SELECT min(s.v_ticks) 
FROM summary s 
WHERE s.rk = 1 
0

est-il pas la même chose que

WITH summary AS( 
SELECT v_seed, MAX(v_ticks) 
FROM simulations 
WHERE v_exp=23 AND v_seed IN (2133836778, -2061794068, 1260042744, -1324330098, -423279216, -685846464, 142959438, -1154715079, 1062336798,-624140595, -922352011, -613647601, -330177159, 1945002173, 131053356, -216538235, -636982783, 979930868, 321237028, -1103129161, 476235295, -1916604834, -54027108, 17850135, -60658084)) 
GROUP BY v_seed) 
SELECT MIN(v_ticks) 
+0

Pgsql ne trouve pas v_ticks à la fin de la requête MIN (v_ticks): / – reyman64

0

Cela devrait faire l'affaire (désolé, pas Postgres db pour tester, mais cela fonctionne sur mysql). Assurez-vous d'avoir un index sur v_seed et v_exp car les deux lignes sont utilisées pour filtrer les données à un moment donné.

select min(s.max_tick) as smallest_max 
from (select max(v_ticks) as max_tick 
     from wts_test 
     where v_exp=23 AND 
      v_seed IN (2133836778, -2061794068, 1260042744, -1324330098, -423279216, -685846464, 142959438, -1154715079, 1062336798,-624140595, -922352011, -613647601, -330177159, 1945002173, 131053356, -216538235, -636982783, 979930868, 321237028, -1103129161, 476235295, -1916604834, -54027108, 17850135, -60658084) 
    group by v_seed) s 
Questions connexes