Inställning för PostGIS-prestanda är ungefär som att ställa in för någon PostgreSQL-arbetsbelastning. Det enda ytterligare övervägandet är att geometrier och raster vanligtvis är stora, så minnesrelaterade optimeringar har i allmänhet större inverkan på PostGIS än andra typer av PostgreSQL-frågor.
För allmänna detaljer om optimering av PostgreSQL, se Tuning your PostgreSQL Server.
För PostgreSQL 9.4+ kan konfigurationen ställas in på servernivå utan att röra postgresql.conf
eller postgresql.auto.conf
med hjälp av kommandot ALTER SYSTEM
.
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;
Förutom Postgres-inställningarna har PostGIS några anpassade inställningar som listas i Section 7.22, “Grand Unified Custom Variables (GUC)”.
Dessa inställningar konfigureras i postgresql.conf:
:
Standard: partition
Detta används vanligtvis för tabellpartitionering. Standardvärdet för detta är inställt på "partition", vilket är perfekt för PostgreSQL 8.4 och högre eftersom det kommer att tvinga planeraren att bara analysera tabeller för begränsningsövervägande om de är i en ärvd hierarki och inte betala planeraren straff annars.
Standard: ~ 128 MB i PostgreSQL 9.6
Ställ in på ca 25% to 40% of tillgängligt RAM-minne. På Windows kanske du inte kan ställa in så högt.
max_worker_processes Denna inställning är endast tillgänglig för PostgreSQL 9.4+. För PostgreSQL 9.6+ har denna inställning ytterligare betydelse genom att den styr det maximala antalet processer du kan ha för parallella frågor.
Standard: 8
Ställer in det maximala antalet bakgrundsprocesser som systemet kan stödja. Denna parameter kan endast ställas in vid serverstart.
work_mem - anger storleken på det minne som används för sorteringsoperationer och komplexa frågor
Standard: 1-4MB
Justera upp för stora databaser, komplexa frågor, mycket RAM
Justera ner för många samtidiga användare eller lågt RAM-minne.
Om du har mycket RAM-minne och få utvecklare:
SET work_mem TO '256MB';
maintenance_work_mem - den minnesstorlek som används för VACUUM, CREATE INDEX etc.
Standard: 16-64 MB
Generellt för låg - binder upp I/O, låser objekt medan minne byts ut
Rekommenderar 32 MB till 1 GB på produktionsservrar med mycket RAM, men det beror på antalet samtidiga användare. Om du har mycket RAM och få utvecklare:
SET maintenance_work_mem TO '1GB';
max_parallel_workers_per_gather
Denna inställning är endast tillgänglig för PostgreSQL 9.6+ och påverkar endast PostGIS 2.3+, eftersom endast PostGIS 2.3+ stöder parallella frågor. Om den är inställd på högre än 0 kan vissa frågor, till exempel de som involverar relationsfunktioner som ST_Intersects
, använda flera processer och kan köra mer än dubbelt så snabbt när de gör det. Om du har många processorer över bör du ändra värdet för detta till så många processorer som du har. Se också till att öka max_worker_processes
till minst lika högt som det här värdet.
Standard: 0
Ställer in det maximala antalet arbetare som kan startas av en enda Gather-nod
. Parallella arbetare hämtas från den pool av processer som fastställs av max_worker_processes
. Observera att det begärda antalet arbetare kanske inte är tillgängligt vid körningstillfället. Om detta inträffar kommer planen att köras med färre arbetare än förväntat, vilket kan vara ineffektivt. Om detta värde sätts till 0, vilket är standard, inaktiveras parallell frågeexekvering.
Om du har aktiverat rasterstöd kan du läsa nedan om hur du konfigurerar det på rätt sätt.
Från och med PostGIS 2.1.3 är raster utanför databasen och alla rasterdrivrutiner inaktiverade som standard. För att återaktivera dessa måste du ställa in följande miljövariabler POSTGIS_GDAL_ENABLED_DRIVERS
och POSTGIS_ENABLE_OUTDB_RASTERS
i servermiljön. För PostGIS 2.2 kan du använda den mer plattformsoberoende metoden att ställa in motsvarande Section 7.22, “Grand Unified Custom Variables (GUC)”.
Om du vill aktivera offline-raster:
POSTGIS_ENABLE_OUTDB_RASTERS=1
Alla andra inställningar eller ingen inställning alls inaktiverar raster utanför databasen.
För att aktivera alla GDAL-drivrutiner som finns tillgängliga i din GDAL-installation, ställ in denna miljövariabel enligt följande
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
Om du endast vill aktivera specifika drivrutiner ställer du in din miljövariabel enligt följande:
POSTGIS_GDAL_ENABLED_DRIVERS="GTiff PNG JPEG GIF XYZ"
![]() |
|
Om du använder Windows, använd inte citattecken för drivrutinslistan |
Inställningen av miljövariabler varierar beroende på operativsystem. För PostgreSQL installerat på Ubuntu eller Debian via apt-postgresql är det bästa sättet att redigera /etc/postgresql/
, där 10 avser versionen av PostgreSQL och main avser klustret.10
/main
/environment
I Windows, om du kör som en tjänst, kan du ställa in via systemvariabler som du hittar i Windows 7 genom att högerklicka på Dator->Egenskaper Avancerade systeminställningar eller i utforskaren genom att navigera till Kontrollpanelen\Alla kontrollpanelsalternativ\System
. Klicka sedan på Avancerade systeminställningar ->Avancerat->Miljövariabler och lägg till nya systemvariabler.
När du har ställt in miljövariablerna måste du starta om din PostgreSQL-tjänst för att ändringarna ska träda i kraft.
Om du använder PostgreSQL 9.1+ och har kompilerat och installerat extensions / postgis-modulerna kan du förvandla en databas till en spatial med hjälp av EXTENSION-mekanismen.
Core postgis-tillägget inkluderar geometri, geografi, spatial_ref_sys och alla funktioner och kommentarer. Raster och topologi är paketerade som ett separat tillägg.
Kör följande SQL-snutt i den databas som du vill aktivera spatialt:
CREATE EXTENSION IF NOT EXISTS plpgsql; CREATE EXTENSION postgis; CREATE EXTENSION postgis_raster; -- OPTIONAL CREATE EXTENSION postgis_topology; -- OPTIONAL
![]() |
|
Detta behövs i allmänhet bara om du inte kan eller inte vill få PostGIS installerat i PostgreSQL-tilläggskatalogen (till exempel under testning, utveckling eller i en begränsad miljö). |
Att lägga till PostGIS-objekt och funktionsdefinitioner i din databas görs genom att läsa in de olika sql-filerna som finns i [prefix]/share/contrib
enligt specifikationerna under byggfasen.
De centrala PostGIS-objekten (geometri- och geograftyper och deras stödfunktioner) finns i skriptet postgis .sql
. Rasterobjekt finns i skriptet rtpostgis.sql
. Topologiobjekt finns i skriptet topology .sql
.
För en fullständig uppsättning EPSG-koordinatsystemdefinitionsidentifierare kan du också läsa in definitionsfilen spatial_ref_sys.sql
och fylla i tabellen spatial_ref_sys
. Detta gör att du kan utföra ST_Transform()-operationer på geometrier.
Om du vill lägga till kommentarer till PostGIS-funktionerna kan du hitta dem i skriptet postgis_comments.sql
. Kommentarer kan visas genom att helt enkelt skriva \dd [function_name] från ett psql-terminalfönster.
Kör följande Shell-kommandon i din terminal:
DB=[yourdatabase] SCRIPTSDIR=`pg_config --sharedir`/contrib/postgis-3.5/ # 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
Att uppgradera befintliga spatiala databaser kan vara svårt eftersom det kräver ersättning eller införande av nya PostGIS-objektdefinitioner.
Tyvärr är det inte alla definitioner som enkelt kan ersättas i en levande databas, så ibland är det bästa alternativet en dump/reload-process.
PostGIS tillhandahåller en SOFT UPGRADE-procedur för mindre eller bugfix-utgåvor och en HARD UPGRADE-procedur för större utgåvor.
Innan du försöker uppgradera PostGIS är det alltid värt att säkerhetskopiera dina data. Om du använder flaggan -Fc till pg_dump kommer du alltid att kunna återställa dumpningen vid en hård uppgradering.
Om du installerade din databas med hjälp av tillägg måste du också uppgradera med hjälp av tilläggsmodellen. Om du installerade med den gamla sql-skriptmetoden rekommenderas du att byta din installation till tillägg eftersom skriptmetoden inte längre stöds.
Om du ursprungligen installerade PostGIS med tillägg måste du också uppgradera med hjälp av tillägg. Att göra en mindre uppgradering med tillägg är ganska smärtfritt.
Om du kör PostGIS 3 eller senare bör du använda funktionen PostGIS_Extensions_Upgrade för att uppgradera till den senaste versionen som du har installerat.
SELECT postgis_extensions_upgrade();
Om du kör PostGIS 2.5 eller lägre ska du göra följande:
ALTER EXTENSION postgis UPDATE; SELECT postgis_extensions_upgrade(); -- This second call is needed to rebundle postgis_raster extension SELECT postgis_extensions_upgrade();
Om du har flera versioner av PostGIS installerade och inte vill uppgradera till den senaste, kan du uttryckligen ange versionen på följande sätt:
ALTER EXTENSION postgis UPDATE TO "3.6.0dev"; ALTER EXTENSION postgis_topology UPDATE TO "3.6.0dev";
Om du får ett felmeddelande något i stil med:
No migration path defined for … to 3.6.0dev
Sedan måste du säkerhetskopiera din databas, skapa en ny enligt beskrivningen i Section 3.3.1, “Spatial aktivering av databas med hjälp av EXTENSION” och sedan återställa din säkerhetskopia ovanpå den nya databasen.
Om du får ett meddelande som:
Version "3.6.0dev" of extension "postgis" is already installed
Då är allt redan uppdaterat och du kan tryggt ignorera det. OM du inte försöker uppgradera från en utvecklingsversion till nästa (som inte får ett nytt versionsnummer); i så fall kan du lägga till "next" till versionssträngen, och nästa gång måste du släppa "next"-suffixet igen:
ALTER EXTENSION postgis UPDATE TO "3.6.0devnext"; ALTER EXTENSION postgis_topology UPDATE TO "3.6.0devnext";
![]() |
|
Om du installerade PostGIS ursprungligen utan en angiven version kan du ofta hoppa över ominstallationen av postgis-tillägget innan du återställer eftersom säkerhetskopian bara har |
![]() |
|
Om du uppgraderar PostGIS-tillägget från en version före 3.0.0 kommer du att ha ett nytt tillägg postgis_raster som du säkert kan ta bort om du inte behöver rasterstöd. Du kan släppa enligt följande: DROP EXTENSION postgis_raster; |
Detta avsnitt gäller endast för de som installerat PostGIS utan att använda tillägg. Om du har tillägg och försöker uppgradera med detta tillvägagångssätt får du meddelanden som:
can't drop … because postgis extension depends on it
OBS: om du flyttar från PostGIS 1.* till PostGIS 2.* eller från PostGIS 2.* före r7409, kan du inte använda denna procedur utan måste göra en HÅRD UPPDATERING.
När du har kompilerat och installerat (make install) bör du hitta en uppsättning *_upgrade.sql
-filer i installationsmapparna. Du kan lista dem alla med:
ls `pg_config --sharedir`/contrib/postgis-3.6.0dev/*_upgrade.sql
Läs in dem alla i tur och ordning, med början från postgis_upgrade.sql
.
psql -f postgis_upgrade.sql -d your_spatial_database
Samma procedur gäller för raster-, topologi- och sfcgal-tillägg, med uppgraderingsfiler som heter rtpostgis_upgrade.sql
, topology_upgrade.sql
respektive sfcgal_upgrade.sql
. Om du behöver dem:
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
Vi rekommenderar att du byter till en tilläggsbaserad installation genom att köra
psql -c "SELECT postgis_extensions_upgrade();"
![]() |
|
Om du inte kan hitta |
Funktionen PostGIS_Full_Version bör informera dig om behovet av att köra den här typen av uppgradering med hjälp av meddelandet "procs need upgrade".
Med HÅRD UPPGRADERING menar vi fullständig dumpning/omladdning av PostGIS-aktiverade databaser. Du behöver en HÅRD UPPGRADERING när PostGIS-objektens interna lagring ändras eller när MJUK UPPGRADERING inte är möjlig. Bilagan Release Notes rapporterar för varje version om du behöver en dumpning/omladdning (HARD UPGRADE) för att uppgradera.
Dump/reload-processen stöds av skriptet postgis_restore som tar hand om att hoppa över alla definitioner som tillhör PostGIS (inklusive gamla) från dumpningen, vilket gör att du kan återställa dina scheman och data till en databas med PostGIS installerat utan att få duplicerade symbolfel eller föra fram föråldrade objekt.
Kompletterande instruktioner för Windows-användare finns på Windows Hard upgrade.
Förfarandet är som följer:
Skapa en dump i "anpassat format" av den databas du vill uppgradera (låt oss kalla den olddb
) inklusive binära blobs (-b) och verbose (-v) utdata. Användaren kan vara ägaren av db, behöver inte vara postgres superkonto.
pg_dump -h localhost -p 5432 -U postgres -Fc -b -v -f "/somepath/olddb.backup" olddb
Gör en nyinstallation av PostGIS i en ny databas - vi kallar denna databas för newdb
. Se Section 3.3.2, “Spatial aktivering av databas utan att använda EXTENSION (avrådes)” och Section 3.3.1, “Spatial aktivering av databas med hjälp av EXTENSION” för instruktioner om hur du gör detta.
De spatial_ref_sys-poster som finns i din dump kommer att återställas, men de kommer inte att åsidosätta befintliga poster i spatial_ref_sys. Detta är för att säkerställa att korrigeringar i den officiella uppsättningen kommer att spridas korrekt till återställda databaser. Om du av någon anledning verkligen vill ha dina egna åsidosättningar av standardposter, ladda bara inte spatial_ref_sys.sql-filen när du skapar den nya db.
Om din databas är riktigt gammal eller om du vet att du har använt funktioner som inte längre används i dina vyer och funktioner, kan du behöva läsa in legacy.sql
för att alla dina funktioner och vyer etc. ska komma tillbaka på rätt sätt. Gör detta endast om det _verkligen_ behövs. Överväg att uppgradera dina vyer och funktioner innan du dumpar dem, om möjligt. De föråldrade funktionerna kan senare tas bort genom att läsa in uninstall_legacy.sql
.
Återställ din säkerhetskopia till din nya newdb-databas
med postgis_restore. Oväntade fel, om några, kommer att skrivas ut till standardfelströmmen av psql. Förvara en logg över dessa.
postgis_restore "/somepath/olddb.backup" | psql -h localhost -p 5432 -U postgres newdb 2> errors.txt
Fel kan uppstå i följande fall:
Några av dina vyer eller funktioner använder sig av föråldrade PostGIS-objekt. För att åtgärda detta kan du försöka läsa in legacy.sql-skriptet
före återställningen eller så måste du återställa till en version av PostGIS som fortfarande innehåller dessa objekt och försöka migrera igen efter att ha portat din kod. Om legacy.sql
fungerar för dig, glöm inte att fixa din kod så att den slutar använda föråldrade funktioner och ta bort dem genom att läsa in uninstall_legacy.sql
.
Vissa anpassade poster i spatial_ref_sys i dumpfilen har ett ogiltigt SRID-värde. Giltiga SRID-värden är större än 0 och mindre än 999000. Värden i intervallet 999000.999999 är reserverade för internt bruk medan värden över 999999 inte kan användas alls. Alla dina anpassade poster med ogiltiga SRID kommer att behållas, med de > 999999 flyttade till det reserverade intervallet, men tabellen spatial_ref_sys skulle förlora en kontrollbegränsning som skyddar för att invariant ska hålla och eventuellt också dess primära nyckel (när flera ogiltiga SRIDS konverteras till samma reserverade SRID-värde).
För att åtgärda detta bör du kopiera din anpassade SRS till en SRID med ett giltigt värde (kanske i intervallet 910000..910999), konvertera alla dina tabeller till den nya srid (se UpdateGeometrySRID), ta bort den ogiltiga posten från spatial_ref_sys och konstruera om kontrollen (erna) med:
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));
Om du uppgraderar en gammal databas som innehåller fransk IGN-kartografi kommer du förmodligen att ha SRID: er utanför intervallet och du kommer att se, när du importerar din databas, problem som detta:
WARNING: SRID 310642222 converted to 999175 (in reserved zone)
I det här fallet kan du prova följande steg: först kasta ut IGN helt från sql som är resultatet av postgis_restore. Så, efter att ha kört :
postgis_restore "/somepath/olddb.backup" > olddb.sql
kör detta kommando :
grep -v IGNF olddb.sql > olddb-without-IGN.sql
Skapa sedan din newdb, aktivera de nödvändiga Postgis-tilläggen och infoga det franska systemets IGN korrekt med: detta skript Efter dessa åtgärder, importera dina data :
psql -h localhost -p 5432 -U postgres -d newdb -f olddb-without-IGN.sql 2> errors.txt