Медленный поиск минимума в списке максимумов с помощью sql with-clause

У меня вопрос по этому запросу, для меня он немного медленнее :(

Моя проблема: я ищу минимальные отметки в списке, который содержит каждый максимум каждого списка отметок по семенам.

=> Равно min (max (seed1), max (seed2), max (seed 3) и т. Д.)

PS: каждое семя содержит ~ 10000 строк (1 строка = 1 тик) PS2: у меня есть одна таблица, содержащая все данные (я знаю, что это не очень хорошее решение, но в настоящее время у меня нет выбора в моем проекте). Симуляция содержит миллионы строк, гул .. вроде 40 M: / PS3: У меня был индекс по v_seed и v_exp.

Время выполнения этого запроса составляет ~ 135 секунд, это очень медленно :(

 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

ОБНОВЛЕНИЕ 1: ОБЪЯСНЕНИЕ ИНФОРМАЦИИ

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)

Если у вас есть идея оптимизировать этот запрос, это круто :) Thx!


person reyman64    schedule 30.09.2010    source источник
comment
есть ли у моделирования кластерный индекс?   -  person Noel Abrahams    schedule 30.09.2010
comment
Что говорит планировщик запросов?   -  person vol7ron    schedule 01.10.2010
comment
Нет кластеризованного индекса, только простой индекс по столбцам v_seed и v_xp   -  person reyman64    schedule 01.10.2010


Ответы (3)


Убедитесь, что в таблице Simulations есть кластерный индекс на v_seed, и попробуйте следующее:

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
person Noel Abrahams    schedule 30.09.2010

Разве это не то же самое, что

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)
person a1ex07    schedule 30.09.2010
comment
Pgsql не находит v_ticks в конце запроса MIN (v_ticks): / - person reyman64; 01.10.2010

Это должно помочь (извините, нет postgres db для тестирования, но он работает с mysql). Убедитесь, что у вас есть индекс для v_seed и v_exp, поскольку обе строки используются для фильтрации данных в какой-то момент.

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
person Chadwick    schedule 30.09.2010