2016-11-30 36 views
0

說我有20萬行我想索引像這樣的表:如果我的索引是部分索引,它在性能/索引大小方面會有明顯不同嗎?

CREATE INDEX fruit_color 
    ON fruits 
    USING btree 
    (color); 

現在,讓我們說,只有2%的水果有顏色,其餘的將是NULL。我的查詢將NEVER希望找到顏色NULL(無顏色)水果,所以問題是,它讓PostgreSQL的一個區別,如果我改變指數:

CREATE INDEX fruit_color 
    ON fruits 
    USING btree 
    (color) 
    WHERE color IS NOT NULL; 

我不知道多少關於postgresql處理索引的內部方式,所以這就是我問的原因。

PS postgresql版本是9.2

+0

我的猜測是,索引的性能不會有太大的變化,因爲在這兩種情況下,顏色的BTree部分看起來都很相似。索引的大小可能不同。你有沒有試過用'EXPLAIN'實際使用兩個索引? –

回答

0

是的,這將有所作爲。有多少差異取決於索引的使用方式。

如果只有一種具有某種顏色的水果,並且您按顏色搜索這種水果,那麼它就沒有多大區別;可能會訪問少一頁的頁面(因爲索引可能少一層)。

如果某種顏色的水果很多,改進效果會很好,因爲掃描整個索引(對於位圖索引掃描)或其中較大部分(對於常規或索引)會便宜得多 - 僅掃描)。 如果索引很大,PostgreSQL將更不願意掃描完整索引,而可能會選擇順序表掃描。

+0

我實現了這兩個索引,我可以說索引的大小也是非常不同的。部分是小得多! –