Mapnik 顯示優化

緣起

日常填坑記錄,你值得擁有!

數據庫優化

參考資料:

  1. https://wiki.openstreetmap.org/wiki/Osm2pgsql/benchmarks
  2. https://www.cnblogs.com/shanyou/p/3495935.html
  3. https://www.percona.com/blog/2018/08/31/tuning-postgresql-database-parameters-to-optimize-performance/
  4. https://stackify.com/postgresql-performance-tutorial/

Mapnik XML配置優化

  1. Datasource那塊的table參數使用查詢而不是表名,不要將所有的列都查詢出來
    這種方式會查詢所有的列

    <Parameter name="table">planet_osm_point</Parameter>
    

    查詢需要的列,減少查詢列的數量

    (select way,place from planet_osm_point where place is not null) as foo
    
  2. 控制要遍歷查詢行的數量,可以設置過濾條件

     <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
    
  3. 將Filtering過濾條件移動到PostGIS的where語句中

  4. 簡化過濾條件,優化SQL

  5. 創建索引
    創建索引可以使查詢更快

     CREATE INDEX idx_buildings_the_geom ON buildings USING gist(the_geom);
    

    如果過濾或者排序指定的字段,可以堆這個字段配置索引

     CREATE INDEX idx_buildings_code ON buildings USING btree(code);
    
  6. Use asynchronous PostGIS datasource

  7. 一般的Postgresql保持數據庫優化。
    你應該打開autovacuum。如果您有正在更新的數據源(例如OpenStreetMap數據),則需要定期對數據庫進行ANALYZEREINDEX。您應該不時運行此SQL命令維護

    ANALYZE; REINDEX;
    

    根據您的需要,您可能還希望定期對數據進行CLUSTER

  8. 使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章