2017-10-01 5 views
0

可能であれば、クエリのパフォーマンスを向上させるために助けてください。私は、クエリPostgresqlはネストしたループを避けて結合します

select 
     s."CustomerCode", 
     s."MaterialCode", 
     fw."Name", 
     fw."ReverseName", 
     s."Uc" 
    from 
     "Sales" s 
    left join 
     "FiscalWeeks" fw on s."SalesDate" between fw."StartedAt" and fw."EndedAt" 

と実行計画以下のいる

は、私は、次のインデックス

CREATE INDEX "Sales_SalesDate_idx" ON public."Sales" USING btree ("SalesDate"); 
ADD CONSTRAINT "FiscalWeekUnique" EXCLUDE USING gist (daterange("StartedAt", "EndedAt", '[]'::text) WITH &&); 

PostgreSQLのバージョンが

"PostgreSQL 9.5.0, compiled by Visual C++ build 1800, 32-bit" 
されてい

"Nested Loop Left Join (cost=0.00..1439970.46 rows=8954562 width=40) (actual time=0.129..114889.581 rows=1492427 loops=1)" 
" Join Filter: ((s."SalesDate" >= fw."StartedAt") AND (s."SalesDate" <= fw."EndedAt"))" 
" Rows Removed by Join Filter: 79098631" 
" Buffers: shared hit=3818 read=10884" 
" -> Seq Scan on "Sales" s (cost=0.00..29625.27 rows=1492427 width=26) (actual time=0.098..1216.287 rows=1492427 loops=1)" 
"  Buffers: shared hit=3817 read=10884" 
" -> Materialize (cost=0.00..1.81 rows=54 width=26) (actual time=0.001..0.034 rows=54 loops=1492427)" 
"  Buffers: shared hit=1" 
"  -> Seq Scan on "FiscalWeeks" fw (cost=0.00..1.54 rows=54 width=26) (actual time=0.006..0.044 rows=54 loops=1)" 
"    Buffers: shared hit=1" 
"Planning time: 0.291 ms" 
"Execution time: 115840.838 ms" 

です

真空分析は、Iは、PostgreSQLは、販売テーブルの各行については表FiscalWeeksに1行しか存在していることを理解し、ネストされたループを使用していないと思わ

を行いました。私はどうすればそれを説明できますか?

ありがとうございます。

答えて

0

クエリは、結合条件のためにネストループ結合を使用する必要があります。 <=>=演算子は、ハッシュまたはマージ結合をサポートしていません。

シーケンシャルスキャンを回避することができ、参加条件は、内側ループに押し下げることができるように、おそらくあなたは"FiscalWeeks"にインデックスを追加することで、クエリを向上させることができます。それとは無関係の

CREATE INDEX ON "FiscalWeeks" ("StartedAt", "EndedAt"); 

が、テーブル名とカラム名の大文字を避けると、あなたの人生は良くなります。

+0

よろしくお願いします。私は、テーブルFiscalWeeksを、すべての年とFiscalWeekNameの列を含むテーブルDaysに変更することにしました。今、私はテーブルをoperator =と一緒に結合します。 –

関連する問題