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行。
我按INDEX1
,col_date
和{{1}的顺序创建了col_char1
,col_char2
和col_date
的索引col_char1
}。
执行计划是使用col_char2
的索引跳过扫描。我不知道为什么它使用跳过扫描而不是范围扫描。我认为跳过扫描应该使这个查询非常慢,因为索引中的第一列(INDEX1
)有很多不同的值。
答案 0 :(得分:0)
您问题中条件的最佳索引是(col_char1, col_char2, col_date)
上的复合索引(或前两个键可以反转)。
如果您没有此索引,但索引类似,那么我认为将使用跳过扫描。