2016-02-25 115 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。 。 。因爲你在另外兩列有平等條件,在日期上有不平等。 –

相關問題