2011-06-07 27 views
1

我有一張桌子,上面有一堆來自美國各縣的統計數據。創建幾個部分索引,只掃描一次(Postgresql)?

因爲它太大了,我想用一套全面的部分索引來索引它。

CREATE INDEX county_stats_34_idx on stats_county (stateid, countyid, site, yeargroup, foo, bar) 
WHERE stateid = 1; 
CREATE INDEX county_stats_25_idx on stats_county (stateid, countyid, site, yeargroup, foo, bar) 
WHERE stateid = 2; 
... 
CREATE INDEX county_stats_32_idx on stats_county (stateid, countyid, site, yeargroup, foo, bar) 
WHERE stateid = 53; 

這將掃描表的每一行53次,檢查stateid並在適當的位置添加索引。我想知道 - 是否有更有效的方法來創建這些索引?從邏輯上講,它只需需要掃描一次表,一個53項開關...

只是好奇,因爲它似乎我需要做這種事情的頻率...

謝謝!

+0

單個索引有什麼問題? – 2011-06-07 15:01:53

+1

在這種情況下,它將是幾千兆字節,太大而無法加載到本機的內存中,因此查詢性能會很差。 – Stew 2011-06-08 14:20:21

+0

據我所知,多個部分索引不會有太大區別。整個索引不需要在內存中使用;只有它的一部分。部分或沒有,經常使用的部分(如果有的話)將留在內存中。 – 2011-06-08 14:22:10

回答

1

如果您在stateid上添加索引,PG將不必掃描整個表格。當然,構建一個人將不得不掃描整個表格,並且創建實際索引需要掃描該索引。

另外,word on the street是你可以在不同的會話內同時啓動它們。這是有道理的,因爲最好你每行只得到一個磁盤命中,並從此開始緩存命中。雖然在你的情況下,沒有創建兩個索引實際上需要讀取同一行 - 它們都覆蓋了一個不相交的子集。

我想你應該嘗試在stateid上創建一個簡單的索引。

+0

啊,這是有道理的 - 在stateid上索引,然後從它自己的會話中開始每個索引構建。我會放棄這一點。謝謝! – Stew 2011-06-08 14:23:02

+0

也是,這是一個非常豐富的鏈接 - 謝謝@aib! – Stew 2011-06-08 14:26:43