2016-09-06 60 views
0

我得到了一些討厭的sql性能問題。我需要執行statment,如:針對大型數據集的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(我們的數據表),並t2(我們的支持值)。我們在t1t2得到了1kk記錄。列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

什麼是'where 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-clause應該是「WHERE rnum < 26」,應該不是嗎?