緣起
日常填坑記錄,你值得擁有!
數據庫優化
參考資料:
- https://wiki.openstreetmap.org/wiki/Osm2pgsql/benchmarks
- https://www.cnblogs.com/shanyou/p/3495935.html
- https://www.percona.com/blog/2018/08/31/tuning-postgresql-database-parameters-to-optimize-performance/
- https://stackify.com/postgresql-performance-tutorial/
Mapnik XML配置優化
-
Datasource那塊的table參數使用查詢而不是表名,不要將所有的列都查詢出來
這種方式會查詢所有的列<Parameter name="table">planet_osm_point</Parameter>
查詢需要的列,減少查詢列的數量
(select way,place from planet_osm_point where place is not null) as foo
-
控制要遍歷查詢行的數量,可以設置過濾條件
<Parameter name="table">(select * from planet_osm_point where place is not null) as foo</Parameter>
如果你指向渲染rivers, canals, drains, and streams
(SELECT * from planet_osm_line where waterway in ('river','canal','drain','stream')) as foo
如果你指向渲染road tunnels
(SELECT * from planet_osm_line where highway is not null and tunnel in ('yes','true','1')) as foo
-
將Filtering過濾條件移動到PostGIS的where語句中
-
創建索引
創建索引可以使查詢更快CREATE INDEX idx_buildings_the_geom ON buildings USING gist(the_geom);
如果過濾或者排序指定的字段,可以堆這個字段配置索引
CREATE INDEX idx_buildings_code ON buildings USING btree(code);
-
一般的Postgresql保持數據庫優化。
你應該打開autovacuum
。如果您有正在更新的數據源(例如OpenStreetMap數據),則需要定期對數據庫進行ANALYZE
和REINDEX
。您應該不時運行此SQL命令維護ANALYZE; REINDEX;
根據您的需要,您可能還希望定期對數據進行
CLUSTER
。 -
使用extent參數
如果沒有設置extent參數,mapnik執行查詢的sql大概如下:SELECT ST_XMin(ext),ST_YMin(ext),ST_XMax(ext),ST_YMax(ext) FROM (SELECT ST_Extent(geom) as ext from planet_osm_line) as tmp
這回導致每次查詢都會去數據庫中從整個結果中遍歷查詢。有三個參數可以避免整個問題:
extent_from_subquery<Parameter name="extent_from_subquery">true</Parameter>
優點:準確估計範圍
缺點:性能僅在小結果集上獲得
先決條件:- table參數使用子查詢(而不是隻是用一個表名)
- extent參數沒有設置
- estimate_extent參數沒有設置成false
extent
<Parameter name="extent">-20037508,-19929239,20037508,19929239</Parameter>
優點:沒有數據庫開銷
缺點:- 如果源數據的更改影響範圍,則需要更新XML
- 精度較低 - 不好因爲[我不知道 - 與裁剪計算有關嗎?]
覆蓋如下參數:
- extent_from_subquery
- estimate_extent
estimate_extent
<Parameter name="estimate_extent">true</Parameter>
優點:比不設置任何範圍參數更快;對於大型結果集顯着
缺點:對於PostgreSQL> = 8.0.0統計數據由VACUUM ANALYZE
收集,結果範圍將是實際數據的95%
覆蓋如下參數:extent_from_subquery