【TUNE_ORACLE】Oracle索引設計思想(三)過濾因子概述與計算
什麼是過濾因子
過濾因子(FF)是某張表中滿足謂詞條件的行數佔全錶行數的比例,描述了謂詞的選擇性。比如某個課外興趣班每加入一個男生,則謂詞sex=’M’的過濾因子就會變大(重複率變高),所以 過濾因子越小越適合建索引(點陣圖索引除外)。
計算公式
1. 過濾因子(FF)= 結果集的數量 / 表總行數
比如,一個班級的總人數是50人,男生佔30人,因此謂詞sex=’M’的過濾因子就是30/50=60%
2. 平均過濾因子 = 1 / count(distinct(XXX))
因此,在評估一個索引建立的必要性時,最差的情況下的過濾因子大小(趨近於100%)比平均過濾因子更重要,因為最差情況的輸入條件下,基於特定索引的查詢消耗的時間最長。
組合謂詞的過濾因子計算
1. 如果組合謂詞中的列與列之間毫無關聯(非關聯列),則組合謂詞的過濾因子大小就可以透過每個謂詞的過濾因子計算出來。比如某地區的人口資訊表中的組合謂詞“Name = ‘XXX’ and Education=‘XX’”中的這兩個列(姓名和學歷)找不出任何關聯(因為同名的人很多),所以該組合謂詞的過濾因子=FF(NAME)* FF(ADDR)
2. 如果組合謂詞中的列與列之間有一定的關聯(關聯列),則組合謂詞的過濾因子大小大於每個謂詞的過濾因子計算出來的乘積。比如汽車製造商資訊表中的組合謂詞“Make=’XXX’ and Model=’XXXX’”可能存在強關聯,因為一個汽車型號可能只屬於一個特定的製造商(比如只有特斯拉才製造Model Y型汽車,所以僅透過MODEL=’Model Y’這個條件我們就可以無需查詢另一個條件就能知道最終結果大小),因此假設FF(make)=0.1%,FF(model)=0.01%,所以該組合謂詞的過濾因子一定大於或遠大於0.1% * 0.01%的乘積, 因此在實際生產環境中這種組合謂詞不推薦使用,影響了查詢效率,也有可能影響了統計資訊的準確性(即使是人為手動收集統計資訊也會不準確)。
重要說明
1. 不同資料庫廠商對選擇性這個概念的定義不同,Oracle是“不同值的行數除以表中的記錄數”,Sybase是“索引中重複的鍵值比例”,本文以Oracle資料庫作為案例,所以採用Oracle廠商的定義。
2. 對於另一個名詞“高選擇性”,不同的人會有截然相反的理解:有人認為是“一個選擇性很高的數字(謂詞重複率高)”,有人認為是“一個選擇性很低的數字(謂詞重複率低)”。本人習慣於後者的說法,因此本人的文章中的“高選擇性”就表示:“一個選擇性很低的數字”
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2761859/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TUNE_ORACLE】Oracle索引設計思想(二)索引過濾列概述Oracle索引
- 【TUNE_ORACLE】Oracle索引設計思想(一)索引片和匹配列概述Oracle索引
- 【TUNE_ORACLE】Oracle索引設計思想(四)三星級索引Oracle索引
- 【TUNE_ORACLE】檢視索引的叢集因子SQL參考Oracle索引SQL
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(三)Oracle
- 【TUNE_ORACLE】索引定期重建的利與弊Oracle索引
- Mobx 原始碼與設計思想原始碼
- Laravel 模型過濾(Filter)設計Laravel模型Filter
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(五)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(四)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(二)Oracle
- 【TUNE_ORACLE】Oracle Hint之常用Hint功能概述(一)Oracle
- 好程式設計師大資料培訓分享HBase Filter過濾器概述程式設計師大資料Filter過濾器
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(三)Oracle索引
- Java設計模式-過濾器模式Java設計模式過濾器
- 計算機圖形學-線性過濾計算機
- 【TUNE_ORACLE】檢視錶,列和索引的統計資訊SQL參考Oracle索引SQL
- Ftj aRTTy因子計算最佳實踐
- 漲跌因子計算器,鄒衍,三點交易測算支撐壓力
- MySQL 表與索引設計攻略MySql索引
- 【TUNE_ORACLE】檢查統計資訊是否過期SQL參考OracleSQL
- 極簡設計模式-過濾器模式設計模式過濾器
- 程式設計思想 面向切面程式設計程式設計
- 【TUNE_ORACLE】列出可以建立組合索引的SQL(回表再過濾選擇性高的列)的SQL參考Oracle索引SQL
- Kafka 的設計思想Kafka
- 通過 for 迴圈,比較 Python 與 Ruby 程式設計思想的差別Python程式設計
- ReactJS &Flux &Redux 的設計思想與關係ReactJSRedux
- 計算機網路概述計算機網路
- 計算機 網路概述計算機
- 設計模式 - 概述設計模式
- 【TUNE_ORACLE】Oracle健康檢查基礎專案(四)專案檢查步驟概述其三Oracle
- 【TUNE_ORACLE】Oracle健康檢查基礎專案(三)專案檢查步驟概述其二Oracle
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- sql server 索引闡述系列七 索引填充因子與碎片SQLServer索引
- 【TUNE_ORACLE】Oracle Hint之概念與用法Oracle
- 2024 計算導論與程式設計程式設計
- 通用查詢設計思想
- 聊聊領域驅動設計與編碼思想