【TUNE_ORACLE】Oracle索引設計思想(二)索引過濾列概述
什麼是過濾列
過濾列是一種存在於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TUNE_ORACLE】Oracle索引設計思想(三)過濾因子概述與計算Oracle索引
- 【TUNE_ORACLE】Oracle索引設計思想(一)索引片和匹配列概述Oracle索引
- 【TUNE_ORACLE】Oracle索引設計思想(四)三星級索引Oracle索引
- ORACLE索引概述Oracle索引
- 【TUNE_ORACLE】檢視錶,列和索引的統計資訊SQL參考Oracle索引SQL
- 【TUNE_ORACLE】列出可以建立組合索引的SQL(回表再過濾選擇性高的列)的SQL參考Oracle索引SQL
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(二)Oracle索引
- 【TUNE_ORACLE】索引定期重建的利與弊Oracle索引
- SQL Server 列儲存索引 第二篇:設計SQLServer索引
- Oracle索引規劃設計Oracle索引
- oracle重建索引(二)Oracle索引
- 【TUNE_ORACLE】列出SQL謂詞中需要建立索引的列SQL參考OracleSQL索引
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(二)Oracle
- MongoDB索引概述MongoDB索引
- Oracle使用由字串索引的二維陣列Oracle字串索引陣列
- 跳過索引某些列任然使用索引的特性索引
- oracle分割槽索引(二)Oracle索引
- MySQL通過通用列索引來提供一個JSON列索引MySql索引JSON
- oracle索引核心過程Oracle索引
- LSM樹由來、設計思想以及應用到HBase的索引索引
- 【TUNE_ORACLE】檢視索引的叢集因子SQL參考Oracle索引SQL
- 【TUNE_ORACLE】列出索引被哪些SQL引用的SQL參考Oracle索引SQL
- Oracle訪問索引的執行計劃(二)Oracle索引
- mysql索引設計MySql索引
- pandas 設定二級索引索引
- 索引與null(一):單列索引索引Null
- 索引@oracle索引技術索引Oracle
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(一)Oracle索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(三)Oracle索引
- MongoDB之索引(過期索引)MongoDB索引
- oracle iot索引組織表(二)Oracle索引
- 認識SQLServer索引以及單列索引和多列索引的不同SQLServer索引
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- SQL Server 列儲存索引 第一篇:概述SQLServer索引
- 索引設計(組合索引適用場景)索引
- 索引與null(二):組合索引索引Null
- elasticsearch如何設計索引Elasticsearch索引
- MySQL 索引設計概要MySql索引