2016-02-25 74 views
0

SQL只查询一个表,该表有100百万行。为什么oracle对此查询使用索引跳过扫描?

SQL在where子句中有三列,分别为col_date,col_char1col_char2col_datedate类型,但它只有日期部分,没有时间部分,如'2016-02-25 00:00:00',此列有大约1000个唯一值,并且这些值均匀分布在表中的记录之间。 col_char1varchar2类型,它有大约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_datecol_char1col_char2,在顺序col_datecol_char1col_char2

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

+0

您的查询计划中的Cardinanlty是否与实际数据匹配? ....的统计数据是否正确? –

回答

0

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

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

+0

为什么如果索引中的“col_date”列最后没有被跳过,那么此列上的条件将筛选出比其他两列更多的行。 thx – roywang

+1

@roywang。 。 。因为你在另外两列有平等条件,在日期上有不平等。 –

相关问题