2016-09-06 17 views
0

SQLパフォーマンスの問題が発生しました。基本的に私たちはテーブルt1(当社データテーブル)を得た、とt2(弊社サポート値)大規模なデータセットのSQL最適化

SELECT * 
    FROM (SELECT /*+ FIRST_ROWS(26) */ 
     a.*, ROWNUM rnum 
      FROM (SELECT * 
        FROM t1 
       WHERE t1_col1 = 'val1' 
        AND g_dom in ('1', '2', '3') 
        AND g_context IN ('3', '4', '5', '6') 
        AND i_col = 1 
        AND f_col in ('1', '2', '3', '4') 
        AND e_g IN (SELECT e_g 
           FROM t2 
           WHERE t2_col1 = 'val1' 
            AND g_context IN ('3', '4', '5', '6') 
            AND val like 'some val%') 
       ORDER BY order_id DESC) a) 
WHERE rnum > 0; 

:私は次のようなステートメントを実行する必要があります。 t1に1kkレコード、t2に10kkというレコードがあります。カラムg_contextはデータセットを絞り込みますが、valは500kレコードのようなものでした。 order_idで順序付けられた25行が必要です。

SELECT e_g FROM t2 WHERE t2_col1='val1' AND g_context IN('3','4','5','6') AND val like 'some val% 

だが、外側の文の基準を一致させるだけで25レコードを取得するために、内部のステートメントを指示する方法はありますか?

+0

質問のために "説明計画"を表示してください。あなたの意見の中でどんな種類の条件が最も選択的であるかを指定します。条件rnum> 0はどうですか?常に真です – Mike

+0

ORDER_IDにインデックスがありますか? – sers

+2

'' rnum> 0'述語は何をしていますか? 25行だけが必要な場合は、 'rnum <= 25'とすると、オプティマイザがクエリプランでストップキーを使用できるはずです。それはあなたが望むもののように思えますが、クエリプランがなければ、知るのは難しいです。上位25行を取得するためにスキャンできるインデックスがない場合は、それが問題になります。 –

答えて

-1

なぜそんなにのような内部クエリにROWNUMとヒントを移動していない:

SELECT t1.*,row_number() over (order by order_id desc) rn /*+ FIRST_ROWS(26) */ 
       FROM t1 
      WHERE t1_col1 = 'val1' 
       AND g_dom in ('1', '2', '3') 
       AND g_context IN ('3', '4', '5', '6') 
       AND i_col = 1 
       AND f_col in ('1', '2', '3', '4') 
       AND e_g IN (SELECT e_g 
          FROM t2 
          WHERE t2_col1 = 'val1' 
           AND g_context IN ('3', '4', '5', '6') 
           AND val like 'some val%') 
      ORDER BY order_id DESC 

あまりにも私のヒントやROWNUMと、この余分な副選択はどんな意味を成していないようです。

where句は「WHERE rnum < 26」にする必要がありますか?

関連する問題