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是否與實際數據匹配? ....的統計數據是否正確? –