SQL只查询一个表,该表有100百万行。为什么oracle对此查询使用索引跳过扫描?
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行。
我创建的索引INDEX1
与col_date
,col_char1
和col_char2
,在顺序col_date
,col_char1
和col_char2
。
执行计划是索引跳过扫描,使用INDEX1
。我不知道为什么它使用跳过扫描而不是范围扫描。我认为跳过扫描应该使这个查询非常缓慢,因为索引中的第一列(col_date
)有很多不同的值。
您的查询计划中的Cardinanlty是否与实际数据匹配? ....的统计数据是否正确? –