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

oracle为何对此查询使用索引跳过扫描?,oracle,indexing,Oracle,Indexing,SQL只查询一个表,该表有1亿行 SQL在where子句中有三列,col\u date,col\u char1和col\u char2COLU date属于date类型,但它只有日期部分,没有时间部分,如“2016-02-25 00:00:00”,此列有大约1000个唯一值,这些值均匀分布在表中的记录中col_char1属于varchar2类型,它有大约30个唯一值,这些值也均匀分布col_char2也是varchar2类型,它有大约20个唯一值,这些值分布均匀。where子句类似于col_da

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

SQL在where子句中有三列,
col\u date
col\u char1
col\u char2
COLU 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')、col_char1='VAL1'和col_char2='VAL2'
。查询结果约为3000行

我用
col\u date
col\u char1
col\u char2
创建了一个索引
INDEX1
,顺序为
col\u date
col\u char1


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

针对您的问题的最佳索引是
(col\u char1,col\u char2,col\u date)
(或者前两个键可以颠倒)


如果你没有这个索引,但是有一个类似的索引,那么我认为会使用跳过扫描。

为什么索引中的
col\u date
列会被跳过?如果最后没有,则该列上的条件会过滤掉比其他两列更多的行。thx@roywang . . .因为在其他两列上有相等条件,在日期上有不相等条件。查询计划上的cardinanlty是否与实际数据匹配。。。。统计数据正确吗?