使用PARALLEL提示时Oracle跳过索引

我正在使用Oracle数据库 “ Oracle数据库12c企业版12.1.0.2.0版64位”

我正面临一种行为,我不知道这是对还是错。

例如下面的查询

SELECT *
FROM   (SELECT x,y,z,ROW_NUMber() OVER (PARTITION BY x ORDER BY last_date DESC) ROW1 
         FROM HHH
         WHERE s = 0
         AND v_Date <= TO_DATE('20191110','YYYYMMDD') 
         AND t_Date >= TO_DATE('20191110','YYYYMMDD')
WHERE   ROW1 = 1

使用PARALLEL提示时Oracle跳过索引

我在下面创建了一个索引:

CREATE INDEX IDX_HHH_S_V_T_DATE ON HHH (S,v_date desc,t_date desc) compute statistics

优化器始终选择此索引,但是当我提到“并行”提示时:

 SELECT *
    FROM   (SELECT /*+ PARALLEL(8) */ x,ROW_NUMber() OVER (PARTITION BY x ORDER BY last_date DESC) ROW1 
             FROM HHH
             WHERE s = 0
             AND v_Date <= TO_DATE('20191110','YYYYMMDD') 
             AND t_Date >= TO_DATE('20191110','YYYYMMDD')
    WHERE   ROW1 = 1

使用PARALLEL提示时Oracle跳过索引

优化器选择跳过该索引。

我尝试过的解决方案仍然相同:

  • 我将表更改为平行8
  • 我将索引更改为平行8

当试图通过“ INDEX”提示强制优化器使用索引时:

 SELECT *
    FROM   (SELECT /*+ PARALLEL(8) INDEX(HHH (IDX_HHH_S_V_T_DATE))*/ x,'YYYYMMDD')
    WHERE   ROW1 = 1

使用PARALLEL提示时Oracle跳过索引

net00111 回答:使用PARALLEL提示时Oracle跳过索引

该行为没有任何问题。您强制Oracle使用8的DOP。假定DOP为8,则考虑了2个访问路径-并行索引(范围|满|快速满)扫描和并行全表扫描。是非是非,它决定了全表扫描的成本会降低。

请注意,您在上一个示例中并没有真正强制执行索引扫描。您的提示未正确指定。正确的提示应该是INDEX(HHH IDX_HHH_S_V_T_DATE)(无嵌套括号)。

本文链接:https://www.f2er.com/3118990.html

大家都在问