Index: /trunk/import/pp_definition.sql
===================================================================
--- /trunk/import/pp_definition.sql	(revision 331)
+++ /trunk/import/pp_definition.sql	(revision 332)
@@ -22,4 +22,5 @@
 --             Wie im Schema: SchlÃŒssel von integer nach varchar fÃŒr land, regierungsbezirk usw.
 
+  --  IN ARBEIT +++++    substring(_.gml_id,1,16) 
 
 -- ============================
@@ -258,10 +259,10 @@
   SELECT DISTINCT p.gml_id AS person, g.land, g.regierungsbezirk, g.kreis, g.gemeinde
   FROM ax_person          p
-  JOIN ax_namensnummer    n  ON n.benennt = p.gml_id           -- Person <benennt< Namensnummer
-  JOIN ax_buchungsblatt   b  ON n.istbestandteilvon = b.gml_id -- Namensnummer >istBestandteilVon> Blatt
-  JOIN ax_buchungsstelle  s  ON s.istbestandteilvon = b.gml_id -- Blatt <istBestandteilVon< buchungsStelle
-  JOIN ax_flurstueck      f  ON f.istgebucht = s.gml_id        -- buchungsStelle <istGebucht< flurstÃŒck
-  JOIN ax_gemarkung       k  ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer 
-  JOIN gemeinde_gemarkung g  ON k.gemarkungsnummer = g.gemarkung;
+  JOIN ax_namensnummer    n  ON n.benennt=substring(p.gml_id,1,16)            -- Person <benennt< Namensnummer
+  JOIN ax_buchungsblatt   b  ON n.istbestandteilvon=substring(b.gml_id,1,16)  -- Namensnummer >istBestandteilVon> Blatt
+  JOIN ax_buchungsstelle  s  ON s.istbestandteilvon=substring(b.gml_id,1,16)  -- Blatt <istBestandteilVon< buchungsStelle
+  JOIN ax_flurstueck      f  ON f.istgebucht=substring(s.gml_id,1,16)         -- buchungsStelle <istGebucht< flurstÃŒck
+  JOIN ax_gemarkung       k  ON f.land=k.land AND f.gemarkungsnummer=k.gemarkungsnummer 
+  JOIN gemeinde_gemarkung g  ON k.gemarkungsnummer=g.gemarkung;
 
 COMMENT ON VIEW gemeinde_person_typ1 
@@ -275,11 +276,11 @@
   SELECT DISTINCT p.gml_id AS person, g.land, g.regierungsbezirk, g.kreis, g.gemeinde
   FROM ax_person          p
-  JOIN ax_namensnummer    n  ON n.benennt = p.gml_id            -- Person <benennt< Namensnummer
-  JOIN ax_buchungsblatt   b  ON n.istBestandteilVon = b.gml_id  -- Namensnummer >istBestandteilVon> Blatt
-  JOIN ax_buchungsstelle  s1 ON s1.istbestandteilvon = b.gml_id -- Blatt <istBestandteilVon< buchungsStelle1
-  JOIN ax_buchungsstelle  s2 ON s2.gml_id = ANY(s1.an)          -- buchungsStelle2 <(recht)an< buchungsStelle1
-  JOIN ax_flurstueck      f  ON f.istgebucht = s2.gml_id        -- buchungsStelle2 < istGebucht < flurstÃŒck
-  JOIN ax_gemarkung       k  ON f.land = k.land AND f.gemarkungsnummer = k.gemarkungsnummer 
-  JOIN gemeinde_gemarkung g  ON k.gemarkungsnummer = g.gemarkung;
+  JOIN ax_namensnummer    n  ON n.benennt=substring(p.gml_id,1,16)             -- Person <benennt< Namensnummer
+  JOIN ax_buchungsblatt   b  ON n.istBestandteilVon=substring(b.gml_id,1,16)   -- Namensnummer >istBestandteilVon> Blatt
+  JOIN ax_buchungsstelle  s1 ON s1.istbestandteilvon=substring(b.gml_id,1,16)  -- Blatt <istBestandteilVon< buchungsStelle1
+  JOIN ax_buchungsstelle  s2 ON substring(s2.gml_id,1,16)= ANY(s1.an)          -- buchungsStelle2 <(recht)an< buchungsStelle1
+  JOIN ax_flurstueck      f  ON f.istgebucht=substring(s2.gml_id,1,16)         -- buchungsStelle2 < istGebucht < flurstÃŒck
+  JOIN ax_gemarkung       k  ON f.land=k.land AND f.gemarkungsnummer=k.gemarkungsnummer 
+  JOIN gemeinde_gemarkung g  ON k.gemarkungsnummer=g.gemarkung;
 
 COMMENT ON VIEW gemeinde_person_typ2 
@@ -288,5 +289,5 @@
 -- Statistik ÃŒber die Buchungs-Typen je Gemeinde
 -- ToDo: +++++  View "gemeinde_gemarkung" nicht verwenden, auflÃ¶sen
-CREATE VIEW gemeinde_person_statistik
+CREATE OR REPLACE VIEW gemeinde_person_statistik
 AS
   SELECT p.land, p.regierungsbezirk, p.kreis, p.gemeinde, g.gemeindename, p.buchtyp, count(p.person) as personen
@@ -309,5 +310,5 @@
 --      Gemarkungen: 4 Meter
 
-CREATE VIEW pp_gemeinde_analyse AS
+CREATE OR REPLACE VIEW pp_gemeinde_analyse AS
   SELECT land, gemeinde, gemeindename,
          st_npoints(the_geom)    AS umring_alle_punkte,
@@ -316,5 +317,5 @@
 
 
-CREATE VIEW pp_gemarkung_analyse AS
+CREATE OR REPLACE VIEW pp_gemarkung_analyse AS
   SELECT land, gemeinde, gemarkung, gemarkungsname,
          st_npoints(the_geom)    AS umring_alle_punkte,
Index: /trunk/import/patch_2014-09-12.sql
===================================================================
--- /trunk/import/patch_2014-09-12.sql	(revision 332)
+++ /trunk/import/patch_2014-09-12.sql	(revision 332)
@@ -0,0 +1,73 @@
+--
+-- PostNAS 0.8
+-- Anwendung der der Schema-Ãnderungen vom 12.09.2014 auf bestehende Datenbanken
+--
+-- 2014-09-12 FJ Indizierung der ersten 16 Zeichen der gml_id, wenn diese Ziel einer ALKIS-Beziehung ist.
+--
+-- -> aa_objekt
+-- Welche konkreten Tabellen kann das betreffen?
+
+-- -> ap_lpo
+CREATE INDEX ap_lpo_gml16 ON ap_lpo USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_buchungsblatt
+CREATE INDEX ax_buchungsblatt_gml16 ON ax_buchungsblatt USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_buchungsstelle 
+-- FÃŒr Relationen (ALKIS-Beziehungen) aus anderen Tabellen ÃŒber die gml_id ohne Zeitstempel
+CREATE INDEX ax_buchungsstelle_gml16 ON ax_buchungsstelle USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_flurstueck
+CREATE INDEX ax_flurstueck_gml16 ON ax_flurstueck USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_gebaeude
+CREATE INDEX ax_gebaeude_gml16 ON ax_gebaeude USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_lagebezeichnungohnehausnummer 
+CREATE INDEX ax_lagebezeichnungohnehausnummer_gml16 ON ax_lagebezeichnungohnehausnummer USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_lagebezeichnungmithausnummer
+CREATE INDEX ax_lagebezeichnungmithausnummer_gml16 ON ax_lagebezeichnungmithausnummer USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_lagebezeichnungmitpseudonummer
+CREATE INDEX ax_lagebezeichnungmitpseudonummer_gml16 ON ax_lagebezeichnungmitpseudonummer USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_verwaltung
+CREATE INDEX ax_verwaltung_gml16 ON ax_verwaltung USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_grenzpunkt
+CREATE INDEX ax_grenzpunkt_gml16 ON ax_grenzpunkt USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_namensnummer 
+CREATE INDEX ax_namensnummer_gml16 ON ax_namensnummer USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_anschrift
+CREATE INDEX ax_anschrift_gml16 ON ax_anschrift USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_person
+CREATE INDEX ax_person_gml16 ON ax_person USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- -> ax_personengruppe  -- Tabelle im Schema noch nicht vorhanden
+--CREATE INDEX ax_personengruppe_gml16 ON ax_personengruppe USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
+-- Test: -- -> ax_buchungsblatt
+/*
+
+-- Falsch und schnell, Findet nicht die FÃ€lle mit langer ID:
+ SELECT dien.gml_id, herr.gml_id
+   FROM ax_buchungsstelle dien
+   JOIN ax_buchungsstelle herr  
+     ON dien.gml_id = ANY (herr.an) 
+  WHERE dien.endet IS NULL AND herr.endet IS NULL 
+  LIMIT 300;
+-- 78 ms
+
+-- findet alle FÃ€lle, ist aber unbrauchbar langsam:
+ SELECT dien.gml_id, herr.gml_id
+   FROM ax_buchungsstelle dien
+   JOIN ax_buchungsstelle herr  ON substring(dien.gml_id,1,16) = ANY (herr.an) 
+  WHERE dien.endet IS NULL AND herr.endet IS NULL 
+  LIMIT 300;
+-- 19454 ms  (vor dem Patch)
+
+*/
Index: /trunk/import/alkis_PostNAS_schema.sql
===================================================================
--- /trunk/import/alkis_PostNAS_schema.sql	(revision 331)
+++ /trunk/import/alkis_PostNAS_schema.sql	(revision 332)
@@ -50,4 +50,6 @@
 --               * Ãbernahme der Objektartengruppe in den Kommentar zur Tabelle.
 
+-- 2014-09-12 FJ Indizierung der ersten 16 Zeichen der gml_id, wenn diese Ziel einer ALKIS-Beziehung ist.
+--               "delete"-Tabelle aus Norbit-Version passend zum Hist-Trigger.
 
 --  Dies Schema kann NICHT mehr mit der gdal-Version 1.9 verwendet werden.
@@ -98,10 +100,15 @@
 
 COMMENT ON TABLE  import             IS 'PostNAS: Verwaltung der Import-ProgrammlÃ€ufe. Wird nicht vom Konverter gefÃŒllt sondern aus der Start-Prozedur (z.B. konv_batch.sh).';
-COMMENT ON COLUMN import.id          IS 'Laufende Nummer der Konverter-Datei-Verarbeitung. Der Max-Wert von "id" wird als "alkis_beziehungen.import_id" verwendet, um ein vollstÃ€ndiges LÃ¶schen alter Beziehungen zu ermÃ¶glichen.';
+COMMENT ON COLUMN import.id          IS 'Laufende Nummer der Konverter-Datei-Verarbeitung.';
 COMMENT ON COLUMN import.datum       IS 'Zeitpunkt des Beginns des Konverter-Laufes fÃŒr einen Stapel von NAS-Dateien.';
 COMMENT ON COLUMN import.verzeichnis IS 'Ort von dem die NAS-Dateien verarbeitet wurden.';
 COMMENT ON COLUMN import.importart   IS 'Modus des Konverter-Laufes: e="Erstladen" oder a="NBA-Aktualisierung"';
 
--- Tabelle "delete" fÃŒr LÃ¶sch- und FortfÃŒhrungsdatensÃ€tze
+-- Tabelle "delete" fÃŒr LÃ¶sch- und FortfÃŒhrungsdatensÃ€tze.
+-- Ãber diese Tabelle werden Aktualisierungen des Bestandes gesteuert.
+-- Der Konverter ogr2ogr (PostNAS) trÃ€gt die NAS-Operatuonen "delete", "replace" und "update" hier ein.
+-- Die weitere ALKIS-spezifische AusfÃŒhrung dieser Operationen muss durch Trigger auf dieser Tabelle erfolgen.
+-- Das betrifft z.B. das LÃ¶schen von Objekten, die ÃŒber die NAS-Update-Funktion einen "endet"-Eintrag bekommen haben. 
+-- 2014-09-12: "anlass" und "endet" hinzugefÃŒgt. Aktueller Trigger (hist) fÃŒr NAS-"update" benÃ¶tigt diese Spalten.
 CREATE TABLE "delete" (
      ogc_fid             serial NOT NULL,
@@ -111,4 +118,6 @@
      safetoignore        character varying,       -- replace.safetoignore 'true'/'false'
      replacedBy          character varying,       -- gmlid
+	anlass		     character varying,       -- update.anlass
+	endet		     character(20),           -- update.endet
      ignored             boolean DEFAULT false,   -- Satz wurde nicht verarbeitet
      CONSTRAINT delete_pk PRIMARY KEY (ogc_fid)
@@ -125,4 +134,6 @@
 COMMENT ON COLUMN delete.safetoignore IS 'Attribut safeToIgnore von wfsext:Replace';
 COMMENT ON COLUMN delete.replacedBy   IS 'gml_id des Objekts, das featureid ersetzt';
+COMMENT ON COLUMN delete.anlass       IS 'update.anlass';
+COMMENT ON COLUMN delete.endet        IS 'update.endet';
 COMMENT ON COLUMN delete.ignored      IS 'LÃ¶schsatz wurde ignoriert';
 
@@ -130,5 +141,6 @@
 -- B e z i e h u n g e n
 -- ----------------------------------------------
--- Zentrale Tabelle fuer alle Relationen im Buchwerk. Seit PostNAS 0.8 entfallen.
+-- Zentrale Tabelle fuer alle Relationen im Buchwerk. 
+-- Seit PostNAS 0.8 entfallen. Wird aber von PostNAS wieder angelegt, wenn sie fehlt.
 -- Die FremdschlÃŒssel 'beziehung_von' und 'beziehung_zu' verweisen auf die ID des Objekte (gml_id).
 -- ZusÃ€tzlich enthÃ€lt 'beziehungsart' noch ein Verb fÃŒr die Art der Beziehung.
@@ -274,4 +286,5 @@
 CREATE INDEX ap_lpo_geom_idx   ON ap_lpo USING gist  (wkb_geometry);
 CREATE UNIQUE INDEX ap_lpo_gml ON ap_lpo USING btree (gml_id, beginnt);
+CREATE INDEX ap_lpo_gml16      ON ap_lpo USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 CREATE INDEX ap_lpo_endet      ON ap_lpo USING btree (endet);
 CREATE INDEX ap_lpo_dzdv       ON ap_lpo USING gin   (dientzurdarstellungvon);
@@ -506,4 +519,5 @@
 CREATE INDEX ax_flurstueck_geom_idx   ON ax_flurstueck USING gist  (wkb_geometry);
 CREATE UNIQUE INDEX ax_flurstueck_gml ON ax_flurstueck USING btree (gml_id, beginnt);
+CREATE INDEX ax_flurstueck_gml16      ON ax_flurstueck USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 CREATE INDEX ax_flurstueck_lgfzn      ON ax_flurstueck USING btree (land, gemarkungsnummer, flurnummer, zaehler, nenner);
 CREATE INDEX ax_flurstueck_arz        ON ax_flurstueck USING btree (abweichenderrechtszustand);
@@ -611,6 +625,7 @@
 
 CREATE UNIQUE INDEX ax_grenzpunkt_gml ON ax_grenzpunkt USING btree (gml_id, beginnt);
-CREATE INDEX ax_grenzpunkt_abmm ON ax_grenzpunkt USING btree (abmarkung_marke);
-CREATE INDEX ax_grenzpunkt_za   ON ax_grenzpunkt USING btree (zeigtauf);
+CREATE INDEX ax_grenzpunkt_gml16 ON ax_grenzpunkt USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+CREATE INDEX ax_grenzpunkt_abmm  ON ax_grenzpunkt USING btree (abmarkung_marke);
+CREATE INDEX ax_grenzpunkt_za    ON ax_grenzpunkt USING btree (zeigtauf);
 
 COMMENT ON TABLE  ax_grenzpunkt        IS 'Angaben zum FlurstÃŒck: (ZUSO) "Grenzpunkt" ist ein den Grenzverlauf bestimmender, meist durch Grenzzeichen gekennzeichneter Punkt.';
@@ -651,4 +666,5 @@
 
 CREATE UNIQUE INDEX ax_lagebezeichnungohnehausnummer_gml ON ax_lagebezeichnungohnehausnummer USING btree (gml_id, beginnt);
+CREATE INDEX ax_lagebezeichnungohnehausnummer_gml16      ON ax_lagebezeichnungohnehausnummer USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 CREATE INDEX ax_lagebezeichnungohnehausnummer_key        ON ax_lagebezeichnungohnehausnummer USING btree (land, regierungsbezirk, kreis, gemeinde,lage);
 --EATE INDEX ax_lagebezeichnungohnehausnummer_beschreibt ON ax_lagebezeichnungohnehausnummer USING gin (beschreibt);
@@ -701,4 +717,5 @@
 
 CREATE UNIQUE INDEX ax_lagebezeichnungmithausnummer_gml ON ax_lagebezeichnungmithausnummer USING btree (gml_id, beginnt);
+CREATE INDEX ax_lagebezeichnungmithausnummer_gml16      ON ax_lagebezeichnungmithausnummer USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 CREATE INDEX ax_lagebezeichnungmithausnummer_lage       ON ax_lagebezeichnungmithausnummer USING btree (gemeinde, lage);
 --EATE INDEX ax_lagebezeichnungmithausnummer_hat        ON ax_lagebezeichnungmithausnummer USING gin   (hat);
@@ -760,5 +777,6 @@
 
 CREATE UNIQUE INDEX ax_lagebezeichnungmitpseudonummer_gml ON ax_lagebezeichnungmitpseudonummer USING btree (gml_id, beginnt);
---EATE INDEX ax_lagebezeichnungmitpseudonummer_gehoertzu ON ax_lagebezeichnungmitpseudonummer USING btree (gehoertzu);
+CREATE INDEX ax_lagebezeichnungmitpseudonummer_gml16      ON ax_lagebezeichnungmitpseudonummer USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+--EATE INDEX ax_lagebezeichnungmitpseudonummer_gehoertzu  ON ax_lagebezeichnungmitpseudonummer USING btree (gehoertzu);
 
 COMMENT ON TABLE  ax_lagebezeichnungmitpseudonummer        IS 'Angaben zur Lage: (NREO) "Lagebezeichnung mit Pseudonummer" ist die von der KatasterbehÃ¶rde fÃŒr ein bestehendes oder geplantes GebÃ€ude vergebene Lagebezeichnung und ggf. einem Adressierungszusatz, wenn von der Gemeinde fÃŒr das GebÃ€ude keine Lagebezeichnung mit Hausnummer vergeben wurde (z.B. Kirche, NebengebÃ€ude).';
@@ -1488,4 +1506,5 @@
 
 CREATE UNIQUE INDEX id_ax_person_gml ON ax_person USING btree (gml_id, beginnt);
+CREATE INDEX        ax_person_gml16  ON ax_person USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 
 CREATE INDEX ax_person_hat  ON ax_person  USING gin  (hat);
@@ -1518,8 +1537,12 @@
 --Es handelt sich um die inverse Relationsrichtung.';
 
+
 --AX_Personengruppe
 -- Objektart: AX_Personengruppe Kennung: 21002
 -- 'Personengruppe' ist die Zusammenfassung von Personen unter einem Ordnungsbegriff.
 -- ** Tabelle bisher noch nicht generiert
+
+-- CREATE INDEX ax_personengruppe_gml16 ON ax_personengruppe USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
 
 -- A n s c h r i f t
@@ -1556,4 +1579,5 @@
 
 CREATE UNIQUE INDEX ax_anschrift_gml  ON ax_anschrift  USING btree (gml_id, beginnt);
+CREATE INDEX       ax_anschrift_gml16 ON ax_anschrift  USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 --EATE        INDEX ax_anschrift_bsa  ON ax_anschrift  USING gin   (beziehtsichauf);
 --EATE        INDEX ax_anschrift_gz   ON ax_anschrift  USING gin   (gehoertzu);
@@ -1593,4 +1617,8 @@
 COMMENT ON COLUMN ax_verwaltung.haengtan       IS '-> Beziehung zu ax_person (1): Durch die Relation ''Verwaltung'' hÃ€ngt an ''Person'' wird die Verwaltung namentlich benannt.';
 
+CREATE UNIQUE INDEX ax_verwaltung_gml  ON ax_verwaltung USING btree (gml_id, beginnt);
+CREATE INDEX ax_verwaltung_gml16       ON ax_verwaltung USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+CREATE INDEX ax_verwaltung_han         ON ax_verwaltung USING btree (haengtan);
+
 
 -- V e r t r e t u n g
@@ -1610,5 +1638,5 @@
      haengtan            character varying,    --> ax_person
      beziehtsichauf      character varying[],  --> ax_flurstueck
-      CONSTRAINT ax_vertretung_pk PRIMARY KEY (ogc_fid)
+     CONSTRAINT ax_vertretung_pk PRIMARY KEY (ogc_fid)
 );
 SELECT AddGeometryColumn('ax_vertretung','dummy',:alkis_epsg,'POINT',2);
@@ -1620,4 +1648,7 @@
 COMMENT ON COLUMN ax_vertretung.haengtan       IS '-> Beziehung zu ax_person (1): Die Relation ''Vertretung'' hÃ€ngt an ''Person'' sagt aus, welche Person die Vertretung wahrnimmt.';
 COMMENT ON COLUMN ax_vertretung.beziehtsichauf IS '-> Beziehung zu ax_flurstueck (0..*): Die Relation ''Vertretung'' bezieht sich auf ''FlurstÃŒck'' sagt aus, fÃŒr welche FlurstÃŒcke die Vertretung wahrgenommen wird.';
+
+CREATE INDEX ax_vertretung_han         ON ax_vertretung USING btree (haengtan);
+CREATE INDEX ax_vertretung_bezauf      ON ax_vertretung USING gin   (beziehtsichauf);
 
 
@@ -1652,4 +1683,6 @@
 
 CREATE UNIQUE INDEX ax_namensnummer_gml   ON ax_namensnummer  USING btree (gml_id, beginnt);
+CREATE INDEX  ax_namensnummer_gml16       ON ax_namensnummer  USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
+
 CREATE        INDEX ax_namensnummer_barvz ON ax_namensnummer  USING btree (bestehtausrechtsverhaeltnissenzu);
 CREATE        INDEX ax_namensnummer_ben   ON ax_namensnummer  USING btree (benennt);
@@ -1739,4 +1772,5 @@
 
 CREATE UNIQUE INDEX ax_buchungsstelle_gml ON ax_buchungsstelle USING btree (gml_id, beginnt);
+CREATE INDEX ax_buchungsstelle_gml16  ON ax_buchungsstelle  USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 
 CREATE INDEX ax_buchungsstelle_an     ON ax_buchungsstelle  USING gin  (an);
@@ -1820,4 +1854,5 @@
 CREATE INDEX ax_gebaeude_geom_idx   ON ax_gebaeude USING gist (wkb_geometry);
 CREATE UNIQUE INDEX ax_gebaeude_gml ON ax_gebaeude USING btree (gml_id, beginnt);
+CREATE INDEX ax_gebaeude_gml16      ON ax_gebaeude USING btree (substring(gml_id,1,16)); -- ALKIS-Relation
 
 CREATE INDEX ax_gebaeude_geh  ON ax_gebaeude USING gin   (gehoert);
Index: /trunk/import/sichten.sql
===================================================================
--- /trunk/import/sichten.sql	(revision 331)
+++ /trunk/import/sichten.sql	(revision 332)
@@ -32,8 +32,5 @@
 --  2014-09-02 Tabelle "alkis_beziehungen" ÃŒberflÃŒssig machen. Relationen nun ÃŒber Spalten in den Objekttabellen. 
 --  2014-09-11 Neu: View "fehlersuche_namensanteile_je_blatt", substring(gml_id) bei Relation-Join, mehr "endet IS NULL"
-
--- ToDo: Einige Views sind sehr langsam geworden. Z.B. exp_csv welcher doppelverbindung verwendet.
---       Dadurch Export aus Bauchauskunft sehr langsam!
---       Derzeit provisorische Version von "doppelverbindung" (schnell aber nicht ganz korrrekt).
+--  2014-09-12 Korrektur "doppelverbindung" (nach Patch der Indices fÃŒr Relation auf Substring(gml_id,1,16))
 
 -- Bausteine fÃŒr andere Views:
@@ -53,7 +50,4 @@
 
 --           DROP VIEW public.doppelverbindung;
-
-/*  -- korrekte Version, leider unertrÃ€glich langsam, z.B. beim Export von CSV aus der Auskunft
-
 CREATE OR REPLACE VIEW public.doppelverbindung
 AS
@@ -74,27 +68,4 @@
    WHERE dien.endet IS NULL;   -- FÃŒr das zusÃ€tzliche Verbindungselement die Historie HIER ausschlieÃen, 
                                -- FÃŒr andere Tabellen muss dies in dem View erfolgen, der dies verwendet.
-*/
-
--- TEST: Schneller, wenn auf Subtring verzichtet wird?  Ja!
--- Aber: Verbindungen ÃŒber aktualisierte, also lange ID's werden nicht gefunden.  
-CREATE OR REPLACE VIEW public.doppelverbindung
-AS
-  -- FS >istGebucht> Buchungstelle
-  SELECT f1.gml_id              AS fsgml,    -- gml_id FlurstÃŒck
-         b1.gml_id              AS bsgml,    -- gml_id Buchungs
-         0                      AS ba_dien
-    FROM ax_flurstueck f1
-    JOIN ax_buchungsstelle b1   ON f1.istgebucht = substring(b1.gml_id,1,16)
- UNION
-  -- FS >istGebucht> Buchungstelle  <an<  Buchungstelle
-  SELECT f2.gml_id              AS fsgml,    -- gml_id FlurstÃŒck
-         b2.gml_id              AS bsgml,    -- gml_id Buchung - (herrschendes GB)
-         dien.buchungsart       AS ba_dien   -- Ein Feld aus der Zwischen-Buchung zur Fall-Unterscheidung
-    FROM ax_flurstueck f2
-    JOIN ax_buchungsstelle dien ON f2.istgebucht = substring(dien.gml_id,1,16)
-  --JOIN ax_buchungsstelle b2   ON substring(dien.gml_id,1,16) = ANY (b2.an)    -- korrekt
-    JOIN ax_buchungsstelle b2   ON           dien.gml_id       = ANY (b2.an)    -- schnell
-   WHERE dien.endet IS NULL;   -- Nur fÃŒr das zusÃ€tzliche Verbindungselement die Historie HIER ausschlieÃen, 
-                               -- FÃŒr andere Tabellen muss dies in dem View erfolgen, der dies verwendet.
 
 COMMENT ON VIEW public.doppelverbindung 
@@ -102,22 +73,4 @@
 Dies ist ausschlieÃlich gedacht zur Verwendung in anderen Views um diese einfacher zu machen.';
 
-/* Test zur Zeitmessung
-
-SELECT dien.gml_id, herr.gml_id
-FROM ax_buchungsstelle dien 
-JOIN ax_buchungsstelle herr  ON dien.gml_id = ANY (herr.an)
-WHERE dien.endet IS NULL AND herr.endet IS NULL
-LIMIT 300;
--- 78 ms
-
-SELECT dien.gml_id, herr.gml_id
-FROM ax_buchungsstelle dien 
-JOIN ax_buchungsstelle herr  ON substring(dien.gml_id,1,16) = ANY (herr.an)
-WHERE dien.endet IS NULL AND herr.endet IS NULL
-LIMIT 300;
--- 19454 ms
-
-
-*/
 
 -- Test-Ausgabe: Ein paar FÃ€lle mit "Recht an"
Index: /trunk/info/info/alkis/alkisfkt.php
===================================================================
--- /trunk/info/info/alkis/alkisfkt.php	(revision 331)
+++ /trunk/info/info/alkis/alkisfkt.php	(revision 332)
@@ -197,5 +197,5 @@
 
 	$sqln="SELECT n.gml_id, n.laufendenummernachdin1421 AS lfd, n.zaehler, n.nenner, n.artderrechtsgemeinschaft AS adr, n.beschriebderrechtsgemeinschaft as beschr, n.eigentuemerart, n.anlass ";
-	$sqln.="FROM ax_namensnummer n WHERE n.istbestandteilvon= $1 ORDER BY n.laufendenummernachdin1421;";
+	$sqln.="FROM ax_namensnummer n WHERE n.istbestandteilvon= $1 AND n.endet IS NULL ORDER BY n.laufendenummernachdin1421;";
 
 	$v = array($gmlid);
@@ -247,5 +247,4 @@
 		$sqlp ="SELECT p.gml_id, p.nachnameoderfirma, p.vorname, p.geburtsname, p.geburtsdatum, p.namensbestandteil, p.akademischergrad ";
 		$sqlp.="FROM ax_person p JOIN ax_namensnummer nn ON nn.benennt=substring(p.gml_id,1,16) WHERE nn.gml_id= $1 AND p.endet IS NULL AND nn.endet IS NULL;";
-		// Timestamp an ID abschneiden!
 
 		$v = array($gmlnn);
@@ -294,5 +293,5 @@
 				// Schleife 3:  A d r e s s e  (OPTIONAL)
 				$sqla ="SELECT a.gml_id, a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer, a.bestimmungsland ";
-				$sqla.="FROM ax_anschrift a JOIN ax_person p ON substring(a.gml_id,1,16) = ANY(p.hat) WHERE p.gml_id= $1 ;"; // ORDER?
+				$sqla.="FROM ax_anschrift a JOIN ax_person p ON substring(a.gml_id,1,16)=ANY(p.hat) WHERE p.gml_id= $1 AND a.endet IS NULL AND p.endet IS NULL;"; // ORDER?
 				$gmlp=$rowp["gml_id"]; // Person
 				$v = array($gmlp);
@@ -345,9 +344,13 @@
 
 			$i++; // cnt Person
-			// als eigene Tab-Zeile?
-			// 'Anteil' ist der Anteil der Berechtigten in Bruchteilen (Par. 47 GBO) an einem gemeinschaftlichen Eigentum (GrundstÃŒck oder Recht).
-			if ($rown["zaehler"] != "") {
+
+			// Anteil als eigene Tab-Zeile:
+			$zaehler=$rown["zaehler"];
+			if ($zaehler != "") {
+				$zaehler=str_replace(".", ",", $zaehler); // Dezimal-KOMMA wenn dem Notar der Bruch nicht reicht
+				$nenner=str_replace(".", ",", $rown["nenner"]);
+				$comnt="Anteil der Berechtigten in Bruchteilen (Par. 47 GBO) an einem gemeinschaftlichen Eigentum (Grundst&uuml;ck oder Recht).";
 				echo "\n<tr>\n\t<td>&nbsp;</td>"; // Sp. 1
-				echo "\n\t<td><p class='avh' title='Anteil'>".$rown["zaehler"]."/".$rown["nenner"]." Anteil</p></td>";
+				echo "\n\t<td><p class='avh' title='".$comnt."'>".$zaehler."/".$nenner." Anteil</p></td>";
 				echo "\n\t<td>&nbsp;</td>\n</tr>"; // Sp. 3
 			}
@@ -369,5 +372,4 @@
 		// kommt vor bei "Fiktives Blatt", kein Fehler 
 		if ($debug > 0) {echo "<p class='dbg'>keine Namensnummern zum Blatt</p>";}
-
 		if ($debug > 2) {echo "<p class='dbg'>Namensnummern: SQL=<br>".$sqln."<br>$1=gml(Blatt)= '".$gmlid."'</p>";}
 	}
Index: /trunk/info/info/alkis/alkisbestnw.php
===================================================================
--- /trunk/info/info/alkis/alkisbestnw.php	(revision 331)
+++ /trunk/info/info/alkis/alkisbestnw.php	(revision 332)
@@ -119,5 +119,5 @@
 	WHERE sh.istbestandteilvon= $1 AND sd.endet IS NULL AND sh.endet IS NULL;";
 
-	$v=array($gmlid); // GB-Blatt
+	$v=array(substr($gmlid,1,16)); // GB-Blatt, in Relation immer nur 16 Zeichen
 	$res=pg_prepare("", $sql);
 	$res=pg_execute("", $v);
