【TUNE_ORACLE】Oracle索引設計思想(四)三星級索引
什麼是三星級索引
三星級索引是一種能夠 同時滿足下面三個條件的查詢效能較好的索引:
第一顆星:擁有最窄索引片(窄索引,把等值謂詞放在索引最前面)
第二顆星:避免排序(出現在關鍵字“order by”後面的列才能滿足第二顆星)
第三顆星:查詢語句中所有列都在索引中(寬索引,也是最容易達成的條件,因此優先順序最低)
三星級索引設計思想
先放例子:
select stu_id,stu_name from students where score between 90 and 100 and class_no=302 order by stu_name;
1. 先滿足第三顆星,把謂詞全部放到索引中(謂詞在索引中的順序先暫定)
2. 有一個等值謂詞“class_no=302”,因此把該謂詞放到索引第一個來 儘可能滿足第一顆星(現在還達不到第一顆星的效果,只是接近)。此時索引可以是idx1(class_no, stu_name, score,stu_id) 或 idx2(class_no, score, stu_name,stu_id)
3. 為了滿足第二顆星,必須把索引中的“stu_name”放在“score”前面(比如上面的索引idx1或者idx3(stu_name,xxx,xxx,xxx))。如果不這樣做,就最佳化器必須先排序,因為索引是按謂詞從左到右來自動排序的, 第二顆星就是利用索引自動排序的特性來減少二次排序。但是這樣做的後果就是:不滿足第一顆星了!因為在滿足“class_no=302”條件後,沒有先對“score”排序,索引不是最窄索引(第一顆星)。
注意
實際情況中, 所有索引都能滿足第三顆星,但是要同時滿足第一和第二顆星的情況較少,因為絕大部分情況下謂詞條件都很複雜,所以大多數情況下只能選擇第一顆星或者第二顆星。比如上面的例子,出現了between謂詞或者其他範圍謂詞,所以不能同時擁有第一顆和第二顆星。 大多數情況下,第一顆星比第二顆星重要!
最後給出一個三星級索引的建立思想(僅供參考):
首先設計一個索引片儘可能窄(第一顆星)的寬索引(第三顆星)。如果查詢語句的索引沒有涉及到排序操作(第二顆星),那這個索引就是完美的三星級索引,否則就是二星級索引,可犧牲第二顆星來達到最優效能。如果要避免排序,則可以犧牲第一顆星,保留第二顆星。這兩種情況在實際中都有用到,需要大家結合具體案例具體分析與選擇。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2762983/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TUNE_ORACLE】Oracle索引設計思想(二)索引過濾列概述Oracle索引
- 【TUNE_ORACLE】Oracle索引設計思想(一)索引片和匹配列概述Oracle索引
- 【TUNE_ORACLE】Oracle索引設計思想(三)過濾因子概述與計算Oracle索引
- 【TUNE_ORACLE】索引定期重建的利與弊Oracle索引
- Oracle索引規劃設計Oracle索引
- Oracle訪問索引的執行計劃(四)Oracle索引
- 【TUNE_ORACLE】檢視錶,列和索引的統計資訊SQL參考Oracle索引SQL
- LSM樹由來、設計思想以及應用到HBase的索引索引
- 【TUNE_ORACLE】檢視索引的叢集因子SQL參考Oracle索引SQL
- 【TUNE_ORACLE】列出索引被哪些SQL引用的SQL參考Oracle索引SQL
- mysql索引設計MySql索引
- pandas 設定二級索引索引
- 索引@oracle索引技術索引Oracle
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(一)Oracle索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(三)Oracle索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(二)Oracle索引
- 【基礎篇索引】索引基礎(四)索引
- 索引設計(組合索引適用場景)索引
- elasticsearch如何設計索引Elasticsearch索引
- MySQL 索引設計概要MySql索引
- 【Oracle索引】-索引基本概念Oracle索引
- Oracle索引——點陣圖索引Oracle索引
- oracle 索引分析及索引重建Oracle索引
- 【TUNE_ORACLE】列出走了低選擇性索引的SQL參考Oracle索引SQL
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- Oracle 索引Oracle索引
- mysql四種索引MySql索引
- Oracle全域性索引和本地索引Oracle索引
- oracle索引詳解 分割槽索引Oracle索引
- 【Mysql】InnoDB 中的聚簇索引、二級索引、聯合索引MySql索引
- 【TUNE_ORACLE】列出SQL謂詞中需要建立索引的列SQL參考OracleSQL索引
- 【Oracle】-【索引-HINT,執行計劃】-帶HINT的索引執行計劃Oracle索引
- mysql 索引設計原則MySql索引
- Oracle 索引和執行計劃Oracle索引
- oracle 索引使用及索引失效總結Oracle索引
- oracle索引操作Oracle索引
- oracle重建索引Oracle索引
- ORACLE索引概述Oracle索引