【发布时间】:2016-02-25 12:17:54
【问题描述】:
SQL只查询一张表,该表有1亿行。
SQL 在 where 子句中有三列,col_date、col_char1 和 col_char2。 col_date 属于date 类型,但只有天部分,没有时间部分,比如'2016-02-25 00:00:00',这个列有大约1000个唯一值,这些值平均分布在表中的记录。 col_char1 是 varchar2 类型,它有大约 30 个唯一值,并且这些值也均匀分布。 col_char2 也是 varchar2 类型,它有大约 20 个唯一值,并且这些值分布均匀。 where 子句类似于col_date >= to_date('2016-02-24 00:00:00') and col_char1 = 'VAL1' and col_char2 = 'VAL2'。查询结果约3000行。
我使用col_date、col_char1 和col_char2 创建了一个索引INDEX1,顺序为col_date、col_char1 和col_char2。
执行计划是使用INDEX1 的索引跳过扫描。我不知道为什么它使用跳过扫描而不是范围扫描。我认为跳过扫描应该使这个查询非常慢,因为索引中的第一列 (col_date) 有很多不同的值。
【问题讨论】:
-
您的查询计划中的基数是否与实际数据匹配? ....统计数据正确吗?