同様のクエリが1分以内に完了するのに、なぜこのクエリの実行に2時間近くかかるのでしょうか。
CREATE TABLE T3 AS
SELECT
A.*,
COALESCE(C.FIELD1,0) AS FIELD1A,
COALESCE(B.FIELD2,0) AS FIELD2A,
COALESCE(B.FIELD3,0) AS FIELD3A,
COALESCE(C.FIELD4,0) AS FIELD4A,
COALESCE(C.FIELD5,0) AS FIELD5A,
B.KEY1,
COALESCE(C.FIELD6,0) AS FIELD6A
FROM T1 A
LEFT JOIN T2 B
ON A.KEY2 = B.KEY1
AND B.TIMEFIELD1 <= DATE '28FEB2013'
AND B.TIMEFIELD2 > DATE '28FEB2013'
AND B.FIELD7= 'X'
LEFT JOIN T2 C
ON A.KEY3 = C.KEY1
AND C.TIMEFIELD1 <= DATE '28FEB2013'
AND C.TIMEFIELD2 > DATE '28FEB2013'
AND C.FIELD7= 'X'
DISTRIBUTE ON RANDOM
T1には約400,000行あります。 T2には約100万行あります。どちらもランダムに配布されます。 T3の行数はT1と同じです(予想どおり)。
EXPLAINは、クエリプランがネストされたループを使用することを提案しています。
(一般的な列名についてはお詫びします)。
オプティマイザーがleft joins
に制約を効率的に適用しないことに気づきました。サブクエリに制約を強制することで、この状況で成功しました。以下のようにクエリを修正することを検討してください。
CREATE TABLE T3 AS
SELECT
A.*,
COALESCE(C.FIELD1,0) AS FIELD1A,
COALESCE(B.FIELD2,0) AS FIELD2A,
COALESCE(B.FIELD3,0) AS FIELD3A,
COALESCE(C.FIELD4,0) AS FIELD4A,
COALESCE(C.FIELD5,0) AS FIELD5A,
B.KEY1,
COALESCE(C.FIELD6,0) AS FIELD6A
FROM T1 A
LEFT JOIN
(select * from T2 where TIMEFIELD1 <= DATE '28FEB2013'
AND TIMEFIELD2 > DATE '28FEB2013'
AND FIELD7= 'X' ) B
ON A.KEY2 = B.KEY1
LEFT JOIN
(select * from T2 where AND TIMEFIELD1 <= DATE '28FEB2013'
AND TIMEFIELD2 > DATE '28FEB2013'
AND FIELD7= 'X') C
ON A.KEY3 = C.KEY1
DISTRIBUTE ON RANDOM
最初にすべきことは、結合のためにテーブルの分散を追加し、where句で整理することです。