2017-11-21 13 views
1

WHERE句を使用して数百の潜在的な文字列を含むNetezzaクエリがあります。私はそれが実行されることに驚いていますが、完了するまでに時間がかかり、時にはエラーが発生します( 'クライアントはトランザクションをロールバックしました')。ここで私のクエリの疑似コードバージョンです。私のクエリでWHERE句の何百もの文字列を含むNetezza SQLクエリの改善

SELECT 
    TO_CHAR(X.I_TS, 'YYYY-MM-DD') AS DATE, 
    X.I_SRC_NM AS CHANNEL, 
    X.I_CD AS CODE, 
    COUNT(DISTINCT CASE WHEN X.I_FLG = 1 THEN X.UID ELSE NULL) AS WIDGETS 

FROM 
    (SELECT 
     A.I_TS, 
     A.I_SRC_NM, 
     A.I_CD, 
     B.UID, 
     B.I_FLG 

    FROM 
     SCHEMA.DATABASE.TABLE_A A 
     LEFT JOIN SCHEMA.DATABASE.TABLE_B B ON A.UID = B.UID 

    WHERE 
     A.I_TS BETWEEN '2017-01-01' AND '2017-01-15' 
     AND B.TAB_CODE IN ('00AV', '00BX', '00C2', '00DJ'... 
          ... 
          ... 
          ... 
          ... 
          ... 
          ... 
          ...) 
    ) X 

GROUP BY 
    X.I_TS, 
    X.I_SRC_NM, 
    X.I_CD 
; 

、私はB.TAB_CODE約1,200までの値(以上10Kのうち)に結果を制限しています。私は正直なところ、それがすべてで動作して驚いているが、それはほとんどの時間を行います。

これを処理する効率的な方法はありますか?

答えて

3

IN句があまりにも煩雑になる場合は、複数の部分でクエリを作成できます。 TAB_CODEを含むテンポラリテーブルを作成し、JOINに使用します。

WITH tab_codes(tab_code) AS (
SELECT '00AV' 
UNION ALL 
SELECT '00BX' 
--- etc --- 
) 
SELECT 
    TO_CHAR(X.I_TS, 'YYYY-MM-DD') AS DATE, 
    X.I_SRC_NM AS CHANNEL, 
    --- etc --- 
    INNER JOIN tab_codes Q ON B.TAB_CODES = Q.tab_code 

あなたはイムが正しく推測した場合(CTAS)本当の一時テーブルを使用することを検討し、さらに

+0

これは実際には私のクエリよりも時間がかかりました。内部クエリを使用したサンプルクエリでは、私のバージョンは84秒で完了しました。これは298秒でした。理由を完全には理解していませんが、CTASを使用したバージョンで作業しています。 – Lenwood

+0

内部クエリとして 'SELECT tab_code'を使って同じパフォーマンスを得ますか? – Stavr00

+0

これで私はこれを少しでも試しました。内部クエリーもより遅く実行されますが、一度タイムアウトしませんでした。以前はクエリが4回中3回タイムアウトしました。私は、なぜそれがより多くの時間がかかるが、クエリがセッションあたり〜10M行を返していると言うのにSQLに慣れていません。結果を集計するSQLを求めていないので、多分この多くの行を返すのに時間がかかります。 – Lenwood

0
  1. をパフォーマンスを向上したい場合は、X.I_TSは実際には「タイムスタンプ」であり、かつ私はそれが1日あたり多くの異なる値を含むと期待しています。それを確認できますか? 私は正しいかもしれませんが、クエリは 'XI_TS、... by group by 1、...'をグループ化することで利益を得られる可能性があります。

  2. さらに 'Count(Distinct Case ...' 私はそれには、高価な 'DISTINCT'を 'MAX(ケース...)'に変更することで取り除くことができます

あなたは私に従うことができます:)

1

私たちは、あなたの主に分布し、それは別の元のテーブルCTASに「安い」だの状況を、見てきました条件を指定してから、そのテーブルをクエリします。

関連する問題