I förra veckan tyckte jag att det tog lite väl lång tid att ladda data till min PostGIS server, utan att det märktes på tillgängliga resurser.
I detta inlägg så testar jag en vanligt föreslagen metod, i praktiken.
Det handlar om ”COPY” i stället för ”INSERT”, vilket skall gå mycket snabbare.
Jag börjar med programmet shp2pgsql-gui, där det går att aktivt välja ”COPY” som metod. Först utan, och sedan med. Ett lagom stort vektorlager (my_06.shp) används i båda fallen.
INSERT: 15 min 12 sek
COPY: 2 min 20 sek
Ett problem med shp2pgsql är att jag inte kan styra i vilket schema resultatet skall sparas i, eller under vilket namn. Det går att fixa i efterhand, men det vore bra om det också gick att göra direkt.
Bara som jämförelse så kör jag samma data med importfunktionen i QGIS DbManager. Det tar ca 18 minuter 53 sekunder. Här kan man dock styra resultatet till det schema man vill och man kan döpa om lagret, men även byta koordinatsystem.
Shp2pgsql-gui är som sagt ett ”gui” som ligger på kommandot shp2pgsql. Med detta kommando kan man styra vilket schema som skall användas samt tabellnamn, men jag är inte lika säker på att det är så enkelt att aktivt välja COPY som metod, men sannolikt tillägget -D i kommandot löser detta.
Det finns ännu en metod via GDAL med verktyget ogr2ogr.
ogr2ogr -f PostgreSQL "PG:dbname='geodata' host='192.168.0.5' port='5432' user='postgres' password='xxxxxxx'" -nln LM.test_my my_06.shp --config PG_USE_COPY YES
Nu tar det 2 minuter och 19 sekunder, vilket är i det närmaste identiskt med shp2pgsql-gui, men nu kan jag ange vilket schema och tabellnamn jag vill skriva resultatet till.
Jag kan inte föreslå ogr2ogr med mina inställningar, dels då det inte är någon tidsvinst och dels då jag inte får tabellen att fungera… Jag gör säkert något fel i mitt kommando och det är väldigt lätt att något blir galet när du själv skall hålla reda på alla tecken, stavningar och kommandon.
Det finns minst ett sätt till…
I två steg skapa en sql-fil lokalt och sedan ladda upp denna med ett psql kommando.
shp2pgsql -D -W "latin1" my_06.shp LM.my_test geodata > my_06.sql
Ovanstående tog 4 sekunder.
psql -h 192.168.0.5 -p 5432 -U updater -d geodata -f my_06.sql
Laddningen av sql-filen tog 2 minuter och 16 sekunder.
Att köra något av ovanstående lokalt på servern kommer att gå fortare. Inte minst sql-filen körs ungefär dubbelt så snabbt, men då måste man även räkna in tiden för överföring. Sammantaget så snabbar det upp processen, men inte i jämförelse med de metoder som jag redovisat här.
Sammanfattning
Det finns olika verktyg för att ladda data till en PostGIS databas och QGIS DbManager är det långsammaste av det jag provat. Det går alltid snabbast att jobba med en databas på lokal dator, men annars är det inte jättestor skillnad på övriga metoder. Så länge man använder COPY och inte INSERT.
I mina tester är COPY 5-10 gånger snabbare, men det kan variera framför allt beroende på hur stora data man har.
Det finns sedan flera optimeringar man kan göra med terminalkommandon som shp2pgsql och ogr2ogr, men för de allra flesta så är ett ”gui” som shp2pgsql-gui ett fullt tillräckligt alternativ.
Tänk dock på att du behöver städa uppladdade data så de hamnar i rätt schema, och om du inte skapar spatialt index vid uppladdningen för att vinna tid så bör du göra det också.
Om du saknar shp2pgsql-gui så fixar du det med:
sudo apt install postgis-gui
Jodå, du kan styra till vilket schema i shp2pgsql-gui. Klicka där det står public för varje fil och editera. Det är ett krångligt sätt om det är många lager, men det går.