【TUNE_ORACLE】Oracle索引設計思想(二)索引過濾列概述

Attack_on_Jager發表於2021-02-23

什麼是過濾列

過濾列是一種存在於where子句中,同時上面也有索引,能起到過濾資料,但是不能在索引片中生效僅能增加索引片厚度的一種列。目的是減少回表。

注:從過濾列的定義可知,並不是所有的列都能夠在索引片中發揮作用,僅僅只是佔位。

 

如何判斷是否是過濾列

1. 首先我們需要檢視目標列是否在索引中,然後再檢視索引中列的順序,並且要從左到右檢視,因為列在索引中越靠左對索引效率影響越大,比如索引idxname(a,b,c,d)。

2. 檢視SQL語句中where子句中是否有以下情況:

(1)是否至少擁有一個簡單的謂詞(比如a = ’xxx’)。如果有,這個列就是匹配列;如果沒有,這個列以及後面的索引列都是非匹配列。

(2)如果是個範圍謂詞(比如b > xxx),那麼除了這個列以外,剩下的列都是非匹配列

(3)如果在最後一個匹配列之後的非匹配索引列,也有一個簡單的謂詞(比如c = ’xxx’),那麼這個列就是過濾列。

 

為了方便理解,我們來看看這個SQL:

create index idx_stud on students(classno,grade,location,age);

select studname from students where classno = 101 and grade > 90 and location = ’bj’;

1. classno這個索引列在索引的第一個,並且是個等值謂詞,所以是個最簡單的謂詞條件,滿足第一個條件,因此classno是匹配列,將在索引片中發揮作用。

2. grade這個索引列在索引的第二個,而且between是個範圍謂詞,也滿足第二個條件,因此grade是匹配列,將在索引片中發揮作用。

3. location這個索引列在索引的第三個,並且是個等值謂詞,雖然是個最簡單的謂詞條件,但是它排在grade這個範圍謂詞的後面,由第二和第三個條件可知,它不能參與匹配過程,也不會在索引片中發揮作用(僅增加了索引片厚度),但參與了索引過濾,所以是過濾列。 但是不要因為它是過濾列而且不參與索引匹配便覺得它不重要,location列幾乎和classno、grade兩列同等重要。


綜上所述,該SQL一共有兩個匹配列(classno和grade)和一個過濾列(location),所以當這個SQL訪問的表中有資料同時滿足這三個謂詞條件時,才會訪問表中的資料。如果:

1. where子句只有classno和location,如where classno = 101 and location = ’bj’,classno依舊是匹配列,location依舊是過濾列。

2. where子句的grade是等值條件,如where classno = 101 and grade = 90 and location = ’bj’,這三列都是匹配列。

3. where子句只有grade和location,如where grade > 90 and location = ’bj’,grade和location只能是過濾列,並且索引片的厚度就是整個索引的大小。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2758842/,如需轉載,請註明出處,否則將追究法律責任。

相關文章