-- OSGeo4W64\apps\alkis-import-dev\postprocessing.d\9_optimize.sql -- Optimieren von ALKIS-Datenbanken aus PostNAS. -- Optionaler Schritt nach dem Laden oder Aktualisieren. -- Ziel ist die Reduzierung des Speicherplatzes und die Verbesserung der Verarbeitungs-Geschwindigkeit. -- 2018-10-29 krz Mi-Ra/Li: Idee "Clustering" aus der PostNAS-Sitzung. SELECT 'Optimierung der Datenbank läuft ...' AS info; -- Anzeige der Größe der Datenbank vor der Optimierung. -- https://www.postgresql.org/docs/current/static/functions-admin.html SELECT pg_database_size(:'DBNAME') AS db_groesse_vorher; -- Wenn keine historischen Objekte verwendet werden sollen, dann können alle Objekte gelöscht werden, -- die einen Eintrag in der Spalte "endet" haben (endet IS NULL). -- Sollte auskommentiert werden, wenn im NBA-Verfahren bewusst die Abgabeart "3100 fallbezogen (mit Historie)" verwendet wird -- und die historischen Objekte von der Anwendung gefiltert angezeigt werden können. SELECT alkis_delete_all_endet(); -- Der Konverter ogr2ogr/NAS liest in einem zweiten Durchlauf durch die NAS-Datei die -- Datensätze mit den Operationen DELETE, REPLACE und UPDATE. -- Diese Sätze werden in die Tabelle "delete" eingefügt, wo sie über einen Datenbank-Trigger die Fortführung der Objekt-Tabellen auslösen. -- Danach können die Sätze der delete-Tabelle wieder gelöscht werden. TRUNCATE delete; -- Die Tabelle "alkis_beziehungen" hat in einer frühen Version des Konverters die Beziehungen zwischen ALKIS-Objekten abgebildet. -- Sie wurde ersetzt durch direkte Relationn zwischen den Objekt-Tabellen. -- Die Tabelle "alkis_beziehungen" sollte von auswertenden Programmen nicht mehr verwendet werden. -- Falls sie vom Konverter (Importer) noch gefüllt wird, kann der Inhalt gelöscht werden. -- Der Befehl TRUNCATE ist schneller, kann aber nur vom Eigentümer verwendet werden. Ggf. ersetzen durch "DELETE". TRUNCATE alkis_beziehungen; --DELETE FROM alkis_beziehungen; -- Wie lange soll das Protokoll gespeichert bleiben? -- Selektiv "alte" Einträge entfernen. -- ts timestamp without time zone DEFAULT now(), SELECT 'Importlog vom ' || date(min(ts)) || ' bis ' || date(max(ts)) AS vorher FROM alkis_importlog; DELETE FROM alkis_importlog WHERE (current_timestamp - ts) > interval '62 days'; -- ca. 2 Monate SELECT 'Importlog vom ' || date(min(ts)) || ' bis ' || date(max(ts)) AS nachher FROM alkis_importlog; -- C l u s t e r n einiger Tabellen wie im Schritt postcreate.d definiert. -- -------------------------------------------------------------------------- -- https://www.postgresql.org/docs/9.4/static/sql-cluster.html -- CLUSTER [VERBOSE] table_name [ USING index_name ] CLUSTER ; -- Reorganisation des Speichers. -- Dauert je nach DB-Größe einen Weile. Die Datenbank is während dieser Zeit nur eingeschränkt benutzbar. VACUUM full; -- Größe der Datenbank nach der Optimierung anzeigen. SELECT pg_database_size(:'DBNAME') AS db_groesse_nachher; -- ENDE --