Почему PostgreSQL сортирует по логическому условию WHERE? - PullRequest
0 голосов
/ 10 июня 2019

Я тестирую некоторые запросы для нескольких материализованных представлений.Все они имеют одинаковую структуру:В столбце (как в примерах) планировщик всегда сортирует набор результатов до завершения.Пример:

Finalize GroupAggregate  (cost=16305.92..16317.98 rows=85 width=21) (actual time=108.301..108.301 rows=1 loops=1)
   Group Key: festivo, nome_strada, ora
   ->  Gather Merge  (cost=16305.92..16315.05 rows=70 width=77) (actual time=108.279..109.015 rows=2 loops=1)
         Workers Planned: 2
         Workers Launched: 2
         ->  Partial GroupAggregate  (cost=15305.90..15306.95 rows=35 width=77) (actual time=101.422..101.422 rows=1 loops=3)
               Group Key: festivo, nome_strada, ora
               ->  Sort  (cost=15305.90..15305.99 rows=35 width=21) (actual time=101.390..101.395 rows=28 loops=3)
                     Sort Key: festivo
                     Sort Method: quicksort  Memory: 25kB
                     ->  Parallel Seq Scan on sft_vmv3_g3 mr  (cost=0.00..15305.00 rows=35 width=21) (actual time=75.307..101.329 rows=28 loops=3)
                           Filter: (festivo AND ((nome_strada)::text = '16th St'::text) AND (ora = '12'::smallint))
                           Rows Removed by Filter: 277892

Меня действительно интересует такой подход, но я до сих пор не нашел объяснения по этому поводу.

1 Ответ

0 голосов
/ 10 июня 2019

Мне любопытно, почему вы не сформулируете логику следующим образом:

SELECT true as a, 'something' as b, '12' as c, CAST(SUM(mr.bar) as INTEGER)
FROM foo.bar as mr
WHERE mr.a AND
      mr.b = 'something' AND
      mr.c = '12';

Это запрос агрегации (из-за SUM() в SELECT), который не имеет явного GROUP BY.Я думаю, что это должно привести к более оптимальному плану выполнения.Кроме того, он всегда будет возвращать одну строку, даже если ни одна строка не соответствует условию.

...