【TUNE_ORACLE】Oracle索引設計思想(三)過濾因子概述與計算

Attack_on_Jager發表於2021-03-09

什麼是過濾因子

過濾因子(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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章