为什么oracle对此查询使用索引跳过扫描?

时间:2016-02-25 12:17:55

标签: oracle indexing

SQL只查询一个表,该表有1亿行。

SQL在where子句中有三列,col_datecol_char1col_char2col_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行。

我按INDEX1col_date和{{1}的顺序创建了col_char1col_char2col_date的索引col_char1 }。

执行计划是使用col_char2的索引跳过扫描。我不知道为什么它使用跳过扫描而不是范围扫描。我认为跳过扫描应该使这个查询非常慢,因为索引中的第一列(INDEX1)有很多不同的值。

1 个答案:

答案 0 :(得分:0)

您问题中条件的最佳索引是(col_char1, col_char2, col_date)上的复合索引(或前两个键可以反转)。

如果您没有此索引,但索引类似,那么我认为将使用跳过扫描。