2016-09-06 59 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”,应该不是吗?