Postgresql
非常大的 btree 索引,只有幾行(openstreetmap gis 數據)
我嘗試使用標準工具 (osm2pgsql) 將開放街道地圖數據的子集導入 Postgres 數據庫。然後我嘗試使用普通 sql 重建表上的索引(刪除它們,然後重新創建它們),它們最終佔用了大量空間。
表大小為 9GB,包含一個 int
id
屬性、70 個文本列(例如,列access_type
有 250 個不同的文本值,在 90% 的情況下為空),以及一個可能很大的幾何列。如果我嘗試:CREATE INDEX planet_osm_polygon_accesstype_index ON planet_osm_polygon USING BTREE (access_type)
我最終得到了一個 1GB 大小的 140k 行的索引,考慮到數據很少,這是巨大的。這似乎在其他系統上不會發生,我嘗試了
ANALYZE
,然後VACUUM
。我對 Postgres 了解不多,但任何關於如何減小索引大小的提示都將非常感激。
(作業系統是 ubuntu 12-04,PostgreSQL 是 9.1 版)
您似乎期望具有
NULL
值的行會自動從 B 樹索引中排除,但事實並非如此。這些也被索引並且可以被搜尋。但是,由於:
access_type
… 在 90% 的情況下為空在你的情況下這幾乎沒有用。這樣的共同值在索引中幾乎沒有意義,無論是它
NULL
還是任何其他值。使用部分索引從索引中排除NULL
值。CREATE INDEX planet_osm_polygon_accesstype_index ON planet_osm_polygon (access_type) WHERE access_type IS NOT NULL;
應該更小,因此更快。
請記住,您可能必須
WHERE
在查詢中包含相同的條件才能使 Postgres 意識到它可以應用部分索引。更多詳細資訊的相關答案: