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.
PostgreSQL-konfiguration kan anges på servernivå utan att ändra postgresql.conf eller postgresql.auto.conf genom kommandot ALTER SYSTEM.
Ange work_mem, läs om konfigurationen så att nya anslutningar använder ändringen och visa det aktuella värdet. Använd SHOW ALL för att lista alla inställningar.
ALTER SYSTEM SET work_mem = '256MB'; SELECT pg_reload_conf(); SHOW work_mem;
Förutom Postgres-inställningarna har PostGIS några anpassade inställningar som listas i Avsnitt 7.22, ”Grand Unified Custom Variables (GUC)”.
Dessa inställningar konfigureras i postgresql.conf::
Standard: partition
Detta används vanligen för tabellpartitionering. Standardvärdet ”partition” tvingar planeraren att bara analysera tabeller med avseende på begränsningar om de ingår i en ärvd hierarki och undviker annars planerarens prestandastraff.
Standard: ~128 MB
Ställ in värdet på cirka 25 % till 40 % av tillgängligt RAM-minne. I Windows kanske du inte kan ställa in ett lika högt värde.
max_worker_processes styr det högsta antalet bakgrundsprocesser som är tillgängliga för servern och begränsar därmed även hur många arbetare som kan delta i 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
Stödet för parallella frågor i moderna PostgreSQL och PostGIS använder denna inställning för att avgöra hur många arbetare en plan får begära. Om den anges till ett värde högre än 0 kan vissa frågor, exempelvis de som använder relationsfunktioner som ST_Intersects, använda flera processer och köras mer än dubbelt så snabbt. Om du har många lediga processorer bör du ändra värdet till antalet processorer du har. Se också till att höja max_worker_processes till minst detta antal.
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.
Rasterdata utanför databasen och alla rasterdrivrutiner är inaktiverade som standard. För att åter aktivera dem måste du ange miljövariablerna POSTGIS_GDAL_ENABLED_DRIVERS och POSTGIS_ENABLE_OUTDB_RASTERS i servermiljön. Du kan också använda den mer plattformsoberoende metoden att ange motsvarande Avsnitt 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 |
Hur miljövariabler anges beror på operativsystemet. För PostgreSQL som installerats på Ubuntu eller Debian via apt-postgresql är den rekommenderade metoden att redigera /etc/postgresql/, där platshållarna avser PostgreSQL:s huvudversion och klustrets namn.MAJOR/CLUSTER/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 har kompilerat och installerat tilläggen/modulerna för postgis kan du göra en databas rumslig med mekanismen EXTENSION.
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.6/
# 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 tillägg. En mindre uppgradering med tillägg är ganska enkel.
Använd funktionen PostGIS_Extensions_Upgrade för att uppgradera till den senaste version du har installerat.
SELECT postgis_extensions_upgrade();
Om du uppgraderar en databas som fortfarande kör PostGIS 2.5 ska du köra ALTER EXTENSION följt av postgis_extensions_upgrade() för att säkerställa att äldre objekt i postgis_raster förs tillbaka till huvudtillägget.
ALTER EXTENSION postgis UPDATE; SELECT postgis_extensions_upgrade();
Det andra anropet behövs för att paketera om tillägget postgis_raster.
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.7.0dev"; ALTER EXTENSION postgis_topology UPDATE TO "3.7.0dev";
Om du får ett felmeddelande något i stil med:
No migration path defined for … to 3.7.0dev
Sedan måste du säkerhetskopiera din databas, skapa en ny enligt beskrivningen i Avsnitt 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.7.0dev" of extension "postgis" is already installed
Allt är redan uppdaterat och du kan tryggt ignorera detta. Om du försöker uppgradera från en utvecklingsversion till nästa (som inte får ett nytt versionsnummer) kan du lägga till "next" i versionssträngen. Nästa gång måste du ta bort suffixet "next" igen:
ALTER EXTENSION postgis UPDATE TO "3.7.0devnext";
ALTER EXTENSION postgis_topology UPDATE TO "3.7.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 får du ett nytt tillägg, postgis_raster, som du tryggt kan ta bort om du inte behöver rasterstöd. |
DROP EXTENSION postgis_raster;
Tillägg har varit den stödda installationsmetoden under många utgåvor. Om du fortfarande använder en opaketerad installation ska du utföra en HÅRD UPPGRADERING till en databas som skapats med tillägg och migrera dina data dit.
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.
Processen med dumpning och återinläsning underlättas av skriptet postgis_restore, som hoppar över alla definitioner som tillhör PostGIS (även äldre) i dumpen. Därmed kan du återställa dina scheman och data till en databas med PostGIS utan fel om duplicerade symboler eller föråldrade objekt.
Kompletterande instruktioner för Windows-användare finns i installationsguiden för PostGIS i Windows.
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 Avsnitt 3.3.2, ”Spatial aktivering av databas utan att använda EXTENSION (avrådes)” och Avsnitt 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 får du troligen SRID:er utanför intervallet och kan vid import av databasen se problem som detta:
WARNING: SRID 310642222 converted to 999175 (in reserved zone)
I detta fall kan du prova följande steg: ta först bort IGN helt från den SQL-kod som genereras av postgis_restore. 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 newdb, aktivera de PostGIS-tillägg som krävs och infoga franska IGN-definitioner av rumsliga referenser med detta skript. Importera sedan dina data:
psql -h localhost -p 5432 -U postgres -d newdb -f olddb-without-IGN.sql 2> errors.txt