暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 具有高NDV前导列的索引跳过扫描

ASKTOM 2019-03-06
408

问题描述

你好,汤姆,

我有这样的情况: 表tbl (220 Mio recs) 以下查询

select col_a, col_b, col_c
from tbl t
where 
  Mod(Dbms_Rowid.Rowid_Row_Number(t.rowid, 2) = 0 --pred 1
and col_d =; --pred 2
复制


col_d在索引t_idx (col_e,col_d) 中
col_d : num_distinct => 17直方图频率
col_e : num_distinct => 〜49 Mios直方图高度平衡

上面where子句的基数 (真实) 是大约47个Mios记录。

请注意,pred 1是由ETL软件生成的进行并行读取的条件 (2个线程),还有第二个mod = 1的查询。

最近,查询需要永远运行 (超过26小时!!)。

在执行计划中,我发现了 “索引跳过扫描”。

我的问题:
1/为什么跳过扫描?我一直认为,索引跳过扫描的前列必须具有低NDV。

2/我知道pred1在数据位置争用方面不好,如果我们选择rowid范围的话。或者简单地删除pred 1并并行化选择。

3/我在查询上仅使用pred 2 (索引中的col_d秒) 运行了explain plan => 我得到了可以理解的全表扫描; 为什么pred 1和pred 2的组合会给出索引跳过扫描?

谢谢你的回答,


专家解答

1.什么是计划?为了在这里提供帮助,我们需要看到它!

你是说

col_d = 
复制


返回4700万行?在col_d中有4900万不同的值?

2.我不太明白why你有那个谓词。它的目的是什么?

3.与1相同: 向我们展示计划!

确保你给我们看execution计划。这个must列显示:

-估计行数
-实际行数
-计划的每个步骤的缓冲区/一致获取
-最后开始
-时代

请确保您还包括访问/过滤谓词。

https://blogs.oracle.com/sql/how-to-create-an-execution-plan
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论