Postgresql

非常大的 btree 索引,只有幾行(openstreetmap gis 數據)

  • July 20, 2014

我嘗試使用標準工具 (osm2pgsql) 將開放街道地圖數據的子集導入 Postgres 數據庫。然後我嘗試使用普通 sql 重建表上的索引(刪除它們,然後重新創建它們),它們最終佔用了大量空間。

表大小為 9GB,包含一個 intid屬性、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 意識到它可以應用部分索引。

更多詳細資訊的相關答案:

引用自:https://dba.stackexchange.com/questions/71909