0

一連の具体化されたビューに対していくつかのクエリをテストしています。それらはすべて、次のように同じ構造を持っています。

EXPLAIN ANALYZE SELECT mr.foo, ..., CAST(SUM(mr.bar) AS INTEGER) AS stuff
    FROM foo.bar mr
    WHERE
        mr.a = 'TRUE' AND
        mr.b = 'something' AND
        mr.c = '12'
    GROUP BY
        mr.a,
        mr.b,
        mr.c;

明らかに、システムはそれらのそれぞれに対して異なるクエリプランを提供していますが、(例のように) WHERE 句にブール列が含まれている場合 (およびその場合にのみ)、プランナーは終了する前に常に結果セットを並べ替えます。例:

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

私はこの種のアプローチについて非常に興味がありますが、これについての説明はまだ見つかっていません。

4

1 に答える 1

0

ロジックを次のように表現しない理由が知りたいです。

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。より最適な実行計画を作成する必要があると思います。さらに、条件に一致する行がない場合でも、常に 1 行が返されます。

于 2019-06-10T14:16:07.680 に答える