調整 PostGIS 的效能很像調整任何 PostgreSQL 工作負載。唯一額外的考量是,幾何圖形和 raster 通常很大,因此與其他類型的 PostgreSQL 查詢相比,與記憶體相關的優化通常對 PostGIS 有更大的影響。
有關優化 PostgreSQL 的一般詳細資訊,請參閱調整您的 PostgreSQL 伺服器。
對於 PostgreSQL 9.4+,可以在伺服器層級設定組態,而無需使用 ALTER SYSTEM
命令來接觸 postgresql.conf
或 postgresql.auto.conf
。
ALTER SYSTEM SET work_mem = '256MB'; -- this forces non-startup configs to take effect for new connections SELECT pg_reload_conf(); -- show current setting value -- use SHOW ALL to see all settings SHOW work_mem;
除了 Postgres 設定之外,PostGIS 還有一些自訂設定,這些設定列在第 7.22 節,「整合自訂變數 (GUCs)」。
這些設定是在 postgresql.conf
中設定的
預設值:partition
這通常用於資料表分割。此設定的預設值設為「partition」,這對於 PostgreSQL 8.4 及更高版本來說是理想的,因為它會強制規劃器僅分析繼承階層中的資料表以進行約束考量,否則不會支付規劃器懲罰。
預設值:在 PostgreSQL 9.6 中約為 ~128MB
設定為可用 RAM 的 25% 到 40% 左右。在 Windows 上,您可能無法設定得這麼高。
max_worker_processes 此設定僅適用於 PostgreSQL 9.4+。對於 PostgreSQL 9.6+,此設定具有額外的重要性,因為它控制平行查詢可以擁有的最大處理程序數。
預設值:8
設定系統可以支援的最大背景處理程序數。此參數只能在伺服器啟動時設定。
work_mem - 設定用於排序作業和複雜查詢的記憶體大小
預設值:1-4MB
針對大型資料庫、複雜查詢和大量 RAM 向上調整
針對多個並行使用者或低 RAM 向下調整。
如果您有大量 RAM 和少數開發人員
SET work_mem TO '256MB';
maintenance_work_mem - 用於 VACUUM、CREATE INDEX 等的記憶體大小。
預設值:16-64MB
通常太低 - 在交換記憶體時會占用 I/O 和鎖定物件
建議在具有大量 RAM 的生產伺服器上使用 32MB 至 1GB,但取決於並行使用者的數量。如果您有大量 RAM 和少數開發人員
SET maintenance_work_mem TO '1GB';
max_parallel_workers_per_gather
此設定僅適用於 PostgreSQL 9.6+,並且僅會影響 PostGIS 2.3+,因為只有 PostGIS 2.3+ 支援平行查詢。如果設定為高於 0,則某些查詢(例如涉及關係函數(如 ST_Intersects
)的查詢)可以使用多個處理程序,並且在這樣做時可以快兩倍以上。如果您有多餘的處理器可用,則應將此值變更為您擁有的處理器數。此外,請確保將 max_worker_processes
提升到至少與此數字一樣高。
預設值:0
設定單個 Gather
節點可以啟動的最大工作執行緒數。平行工作執行緒取自 max_worker_processes
所建立的處理程序集區。請注意,請求的工作執行緒數在執行階段可能無法實際使用。如果發生這種情況,該計畫將以少於預期的工作執行緒執行,這可能會沒有效率。將此值設定為 0(預設值)會停用平行查詢執行。
如果您已啟用 raster 支援,您可能需要閱讀以下有關如何正確設定它的內容。
從 PostGIS 2.1.3 開始,預設會停用 db 外部的 raster 和所有 raster 驅動程式。為了重新啟用這些驅動程式,您需要在伺服器環境中設定以下環境變數 POSTGIS_GDAL_ENABLED_DRIVERS
和 POSTGIS_ENABLE_OUTDB_RASTERS
。對於 PostGIS 2.2,您可以使用設定對應的第 7.22 節,「整合自訂變數 (GUCs)」,這種更跨平台的方法。
如果您想要啟用離線 raster
POSTGIS_ENABLE_OUTDB_RASTERS=1
任何其他設定或完全沒有設定都會停用 db 外部的 raster。
為了啟用 GDAL 安裝中提供的所有 GDAL 驅動程式,請按如下所示設定此環境變數
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
如果您只想啟用特定的驅動程式,請按如下所示設定您的環境變數
POSTGIS_GDAL_ENABLED_DRIVERS="GTiff PNG JPEG GIF XYZ"
![]() |
|
如果您使用的是 Windows,請勿將驅動程式清單括起來 |
設定環境變數會因作業系統而異。對於透過 apt-postgresql 安裝在 Ubuntu 或 Debian 上的 PostgreSQL,首選方法是編輯 /etc/postgresql/
,其中 10 指的是 PostgreSQL 的版本,而 main 指的是叢集。10
/main
/environment
在 Windows 上,如果您是以服務的形式執行,則可以透過系統變數進行設定,對於 Windows 7,您可以透過在「電腦」->「內容」->「進階系統設定」上按一下滑鼠右鍵或在檔案總管中導覽至 控制台\所有控制台項目\系統
來取得。然後按一下「進階系統設定」->「進階」->「環境變數」並新增新的系統變數。
設定環境變數後,您需要重新啟動 PostgreSQL 服務,才能使變更生效。
如果您使用的是 PostgreSQL 9.1+,並且已編譯並安裝 extensions/postgis 模組,則可以使用 EXTENSION 機制將資料庫變成空間資料庫。
核心 postgis 擴充功能包括幾何圖形、地理、spatial_ref_sys 以及所有函數和註解。Raster 和拓撲會作為單獨的擴充功能打包。
在您要啟用空間功能的資料庫中執行下列 SQL 片段
CREATE EXTENSION IF NOT EXISTS plpgsql; CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; -- OPTIONAL CREATE EXTENSION postgis_topology; -- OPTIONAL
![]() |
|
如果您無法或不想在 PostgreSQL 擴充功能目錄中安裝 PostGIS (例如在測試、開發或受限環境中),則通常只需要這樣做。 |
將 PostGIS 物件和函數定義新增至您的資料庫的方法是載入在建置階段指定的 [prefix]/share/contrib
中找到的各種 sql 檔案。
核心 PostGIS 物件 (幾何圖形和地理類型,以及其支援函數) 位於 postgis.sql
指令檔中。Raster 物件位於 rtpostgis.sql
指令檔中。拓撲物件位於 topology.sql
指令檔中。
若要取得一組完整的 EPSG 坐標系統定義識別碼,您也可以載入 spatial_ref_sys.sql
定義檔案,並填入 spatial_ref_sys
資料表。這將允許您對幾何圖形執行 ST_Transform() 作業。
如果您想要將註解新增至 PostGIS 函數,您可以在 postgis_comments.sql
指令檔中找到它們。只要從 psql 終端機視窗輸入 \dd [function_name] 即可檢視註解。
在您的終端機中執行下列 Shell 命令
DB=[yourdatabase] SCRIPTSDIR=`pg_config --sharedir`/contrib/postgis-3.4/ # Core objects psql -d ${DB} -f ${SCRIPTSDIR}/postgis.sql psql -d ${DB} -f ${SCRIPTSDIR}/spatial_ref_sys.sql psql -d ${DB} -f ${SCRIPTSDIR}/postgis_comments.sql # OPTIONAL # Raster support (OPTIONAL) psql -d ${DB} -f ${SCRIPTSDIR}/rtpostgis.sql psql -d ${DB} -f ${SCRIPTSDIR}/raster_comments.sql # OPTIONAL # Topology support (OPTIONAL) psql -d ${DB} -f ${SCRIPTSDIR}/topology.sql psql -d ${DB} -f ${SCRIPTSDIR}/topology_comments.sql # OPTIONAL
升級現有的空間資料庫可能很棘手,因為它需要更換或引入新的 PostGIS 物件定義。
遺憾的是,並非所有定義都可以輕鬆地在即時資料庫中更換,因此有時最好的選擇是傾印/重新載入程序。
PostGIS 為次要版本或錯誤修正版本提供軟升級程序,而為主要版本提供硬升級程序。
在嘗試升級 PostGIS 之前,最好先備份您的資料。如果您使用 pg_dump 的 -Fc 旗標,您將永遠能夠使用硬升級來還原傾印。
如果您使用擴充功能安裝資料庫,則也需要使用擴充功能模型進行升級。如果您使用舊的 sql 指令檔方式安裝,則建議您將安裝切換為擴充功能,因為不再支援指令檔方式。
如果您最初使用擴充功能安裝 PostGIS,則也需要使用擴充功能進行升級。使用擴充功能進行次要升級相當簡單。
如果您執行的是 PostGIS 3 或更高版本,則應使用 PostGIS_Extensions_Upgrade 函數升級到您已安裝的最新版本。
SELECT postgis_extensions_upgrade();
如果您執行的是 PostGIS 2.5 或更低版本,請執行以下操作
ALTER EXTENSION postgis UPDATE; SELECT postgis_extensions_upgrade(); -- This second call is needed to rebundle postgis_raster extension SELECT postgis_extensions_upgrade();
如果您安裝了多個版本的 PostGIS,並且不想升級到最新版本,則可以按如下所示明確指定版本
ALTER EXTENSION postgis UPDATE TO "3.5.2dev"; ALTER EXTENSION postgis_topology UPDATE TO "3.5.2dev";
如果您收到類似以下的錯誤通知
No migration path defined for … to 3.5.2dev
那麼您需要備份資料庫,建立一個新的資料庫,如第 3.3.1 節,「使用 EXTENSION 以啟用資料庫的空間功能」中所述,然後在這個新資料庫上還原備份。
如果您收到類似以下的通知訊息
Version "3.5.2dev" of extension "postgis" is already installed
那麼一切都已經是最新的,您可以安全地忽略它。除非您嘗試從開發版本升級到下一個版本 (不會獲得新的版本號碼);在這種情況下,您可以在版本字串中附加「next」,並且下次您需要再次刪除「next」後綴
ALTER EXTENSION postgis UPDATE TO "3.5.2devnext"; ALTER EXTENSION postgis_topology UPDATE TO "3.5.2devnext";
![]() |
|
如果您最初安裝 PostGIS 時沒有指定版本,則通常可以跳過還原之前重新安裝 postgis 擴充功能,因為備份只有 |
![]() |
|
如果您要從 3.0.0 之前的版本升級 PostGIS 擴充功能,您將擁有一個新的擴充功能 postgis_raster,如果您不需要 raster 支援,您可以安全地刪除它。您可以按如下所示刪除 DROP EXTENSION postgis_raster; |
本節僅適用於未使用擴充功能安裝 PostGIS 的使用者。如果您有擴充功能並嘗試使用此方法升級,您將收到類似以下的訊息
can't drop … because postgis extension depends on it
注意:如果您要從 PostGIS 1.* 移至 PostGIS 2.* 或從 r7409 之前的 PostGIS 2.* 移至 PostGIS 2.*,則您無法使用此程序,而是需要執行硬升級。
編譯並安裝 (make install) 後,您應該會在安裝資料夾中找到一組 *_upgrade.sql
檔案。您可以使用下列命令列出所有檔案
ls `pg_config --sharedir`/contrib/postgis-3.5.2dev/*_upgrade.sql
從 postgis_upgrade.sql
開始,依序載入所有檔案。
psql -f postgis_upgrade.sql -d your_spatial_database
相同的程序適用於 raster、拓撲和 sfcgal 擴充功能,其升級檔案分別命名為 rtpostgis_upgrade.sql
、topology_upgrade.sql
和 sfcgal_upgrade.sql
。如果您需要它們
psql -f rtpostgis_upgrade.sql -d your_spatial_database
psql -f topology_upgrade.sql -d your_spatial_database
psql -f sfcgal_upgrade.sql -d your_spatial_database
建議您透過執行下列命令來切換為以擴充功能為基礎的安裝
psql -c "SELECT postgis_extensions_upgrade();"
![]() |
|
如果您找不到專門用於升級您的版本的 |
PostGIS_Full_Version 函數應該會透過「procs need upgrade」訊息告知您是否需要執行此類升級。
硬升級指的是完整傾印/重新載入已啟用 PostGIS 的資料庫。當 PostGIS 物件的內部儲存方式變更或無法進行軟升級時,您需要執行硬升級。版本說明附錄會針對每個版本報告是否需要透過傾印/重新載入 (硬升級) 來進行升級。
傾印/重新載入過程由 postgis_restore 腳本協助,該腳本會處理跳過傾印中屬於 PostGIS 的所有定義(包括舊定義),讓您可以將您的結構描述和資料還原到已安裝 PostGIS 的資料庫中,而不會出現重複符號錯誤或帶入已棄用的物件。
Windows 使用者的補充說明請參閱 Windows 硬升級。
步驟如下:
建立您要升級的資料庫的「自訂格式」傾印(我們稱之為 olddb
),包括二進位大型物件 (-b) 和詳細 (-v) 輸出。使用者可以是資料庫的擁有者,不需要是 postgres 超級帳戶。
pg_dump -h localhost -p 5432 -U postgres -Fc -b -v -f "/somepath/olddb.backup" olddb
在新資料庫中全新安裝 PostGIS -- 我們將此資料庫稱為 newdb
。請參閱第 3.3.2 節,「不使用 EXTENSION 空間啟用資料庫 (不建議)」和第 3.3.1 節,「使用 EXTENSION 空間啟用資料庫」,以瞭解如何執行此操作。
您傾印中找到的 spatial_ref_sys 項目將會還原,但它們不會覆寫 spatial_ref_sys 中現有的項目。這是為了確保官方集合中的修正會正確傳播到已還原的資料庫。如果因為任何原因,您真的想要覆寫標準項目,只需在建立新資料庫時不載入 spatial_ref_sys.sql 檔案即可。
如果您的資料庫非常老舊,或者您知道您一直在視圖和函數中使用已棄用的函數,您可能需要載入 legacy.sql
,以便所有函數和視圖等都能正確還原。只有在_真正_需要時才執行此操作。如果可能,請考慮在傾印之前升級您的視圖和函數。之後可以透過載入 uninstall_legacy.sql
來移除已棄用的函數。
使用 postgis_restore 將您的備份還原到全新的 newdb
資料庫中。如果發生任何意外錯誤,psql 會將錯誤印到標準錯誤串流中。請保留這些錯誤的記錄。
postgis_restore "/somepath/olddb.backup" | psql -h localhost -p 5432 -U postgres newdb 2> errors.txt
在以下情況下可能會發生錯誤:
您的一些視圖或函數使用了已棄用的 PostGIS 物件。為了修正此問題,您可以嘗試在還原之前載入 legacy.sql
腳本,或者您必須還原到仍然包含這些物件的 PostGIS 版本,然後在移植程式碼後再次嘗試遷移。如果 legacy.sql
的方法對您有效,別忘了修正您的程式碼,停止使用已棄用的函數,並透過載入 uninstall_legacy.sql
來刪除它們。
傾印檔案中 spatial_ref_sys 的某些自訂記錄具有無效的 SRID 值。有效的 SRID 值大於 0 且小於 999000。999000..999999 範圍中的值保留供內部使用,而大於 999999 的值則完全無法使用。您所有具有無效 SRID 的自訂記錄都會保留,大於 999999 的記錄會移至保留範圍,但 spatial_ref_sys 表格會失去用於保護此不變性的檢查約束,並且可能也會失去其主鍵 (當多個無效的 SRID 被轉換為相同的保留 SRID 值時)。
為了修正此問題,您應該將自訂 SRS 複製到具有有效值 (可能在 910000..910999 範圍內) 的 SRID,將您的所有表格轉換為新的 srid (請參閱UpdateGeometrySRID),從 spatial_ref_sys 中刪除無效的項目,並使用以下命令重新建構檢查約束:
ALTER TABLE spatial_ref_sys ADD CONSTRAINT spatial_ref_sys_srid_check check (srid > 0 AND srid < 999000 );
ALTER TABLE spatial_ref_sys ADD PRIMARY KEY(srid));
如果您正在升級包含法國 IGN 製圖的舊資料庫,您可能會遇到超出範圍的 SRID,並且在匯入資料庫時會看到如下問題:
WARNING: SRID 310642222 converted to 999175 (in reserved zone)
在這種情況下,您可以嘗試以下步驟:首先,完全從 postgis_restore 產生的 sql 中移除 IGN。因此,在執行
postgis_restore "/somepath/olddb.backup" > olddb.sql
後,執行以下命令
grep -v IGNF olddb.sql > olddb-without-IGN.sql
然後建立您的 newdb,啟用所需的 Postgis 擴充功能,並使用以下命令正確插入法國系統 IGN:此腳本。完成這些操作後,匯入您的資料
psql -h localhost -p 5432 -U postgres -d newdb -f olddb-without-IGN.sql 2> errors.txt