web-dev-qa-db-ja.com

このNetezzaクエリの明らかな非効率性は?

同様のクエリが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は、クエリプランがネストされたループを使用することを提案しています。

(一般的な列名についてはお詫びします)。

1
jl6

オプティマイザーが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
1
Niederee

最初にすべきことは、結合のためにテーブルの分散を追加し、where句で整理することです。

0
Joe