-- 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
-- ++ Formatierung in besser lesbarem Zahlenformat mit . nach je 3 Stellen.
  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 Obejkt-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?
-- Ggf. seletiv nur "alte" Einträge entfernen: WHERE ... ?  
--TRUNCATE alkis_importlog;
--  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 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 --