Von DB2 Spatial Extender generierte räumliche Indizes

IBM DB2 Spatial Extender stellt einen räumlichen Index mit einem dreistufiges Gitter bereit, mit dem die Anwendungen die zweidimensionalen geographischen Daten in einer räumlichen Spalte abfragen und schnell alle Geometrien innerhalb einer vorgegebenen Ausdehnung identifizieren können.

Der zweidimensionale räumliche Index unterscheidet sich vom herkömmlichen hierarchischen B-Baum-Index von DB2. Der B-Baum-Index kann u. U. nicht auf eine räumliche Spalte angewendet werden, da die zweidimensionale räumliche Spalte die Struktur eines räumlichen Indexes erfordert. Aus demselben Grund können Sie einen räumlichen Index nicht auf eine nicht räumliche Spalte anwenden, und ein räumlicher Index kann nicht auf eine zusammengesetzte Spalte angewendet werden.

Daher beinhaltet die Syntax CREATE INDEX des räumlichen Indexes die zusätzliche Klausel USING, die DB2 anweist, den räumlichen Index von Spatial Extender und nicht den B-Baum-Index zu verwenden. Folgende vollständige Syntax wird verwendet:

CREATE INDEX <index_name> 
ON <table> (<spatial column>)
USING db2gse.spatial_index (<grid level 1>, [grid level 2], [grid level 3])

Der Zusatz der Klausel USING unterscheidet den räumlichen Index vom B-Baum-Index. Der Schemaname "db2gse" muss den Erweiterungsnamen "spatial_index" angeben, da diese Anweisung nicht dem aktuellen Funktionspfad folgt.

Aufgrund der einfachen Natur der Daten, die ein B-Baum indexieren soll, weist der Datenbankdesigner DB2 nur an, den Index in einer oder mehreren Tabellenspalten zu erstellen. Da räumliche Daten jedoch komplex sind, muss der Designer die relative Größenverteilung verstehen. Der Designer muss die optimale Größe und Anzahl der Gitterebenen des räumlichen Indexes bestimmen.

Die Gitterebenen ([Gitterebene 1], [Gitterebene 2], [Gitterebene 3]) werden durch Erhöhen der Zellengröße eingegeben. Daher muss auf der zweiten Ebene gegenüber der ersten und auf der dritten Ebene gegenüber der zweiten die Zellengröße jeweils zunehmen. Die erste Gitterebene ist obligatorisch, Sie können jedoch die zweite und dritte Ebene mit einem Nullwert (0) deaktivieren.

So generiert Spatial Extender einen räumlichen Index

DB2 Spatial Extender erstellt einen räumlichen Index wie folgt:

  1. Spatial Extender überschneidet den Envelope jeder Geometrie mit dem Gitter. Er beginnt dabei mit der ersten Ebene.
  2. Wenn es zu weniger als vier Überschneidungen mit der ersten Gitterebene kommt, gibt Spatial Extender die Geometrie-ID und die IDs der überschneidenden Gitterzellen in den räumlichen Index ein und fährt mit der nächsten Geometrie fort.
  3. Wenn Spatial Extender mehr als vier Überschneidungen erkennt, überschneidet er die Geometrie mit der zweiten Gitterebene. Wenn Sie die zweite Gitterebene nicht aktiviert haben, gibt Spatial Extender die Geometrie-ID und die IDs der Gitterzellen in den räumlichen Index ein und fährt mit der nächsten Geometrie fort.
  4. Wenn es zu weniger als vier Überschneidungen mit der zweiten Gitterebene kommt, gibt Spatial Extender die Geometrie-ID und die IDs der überschneidenden Gitterzellen in den räumlichen Index ein und fährt mit der nächsten Geometrie fort.
  5. Wenn Spatial Extender mehr als vier Überschneidungen erkennt, überschneidet er die Geometrie mit der dritten Gitterebene. Wenn Sie die dritte Gitterebene nicht aktiviert haben, gibt Spatial Extender die Geometrie-ID und die IDs der Gitterzellen in den räumlichen Index ein und fährt mit der nächsten Geometrie fort.
  6. Spatial Extender gibt die Geometrie-ID und die IDs der überschneidenden Gitterzellen der dritten Ebene in den räumlichen Index ein und fährt mit der nächsten Geometrie fort.

Spatial Extender erstellt keine Polygon-Gitterstrukturen. Mit Spatial Extender werden alle Gitterebenen parametrisch dargestellt, indem der Ursprung des XY-Versatzes des Raumbezugssystems der Spalte so definiert wird, dass er sich in den positiven Koordinatenraum ausdehnt. Unter Verwendung eines parametrischen Gitters generiert Spatial Extender die Schnittpunkte mathematisch.

So verwendet Spatial Extender den räumlichen Index

Spatial Extender verwendet einen räumlichen Index, um die Leistung einer räumlichen Abfrage zu verbessern. Die Feldabfrage – die einfachste und vielleicht bekannteste räumliche Abfrage – gibt Geometrien einer räumlichen Spalte aus, die ein benutzerdefiniertes Feld schneiden. Wenn es keinen räumlichen Index gibt, muss Spatial Extender alle Geometrien der räumlichen Spalte mit dem Feld vergleichen.

Unter Verwendung des räumlichen Indexes identifiziert Spatial Extender Index-Gittereinträge, die das Feld schneiden. Da der räumliche Index auf einem Gitter angeordnet ist, erhält Spatial Extender schnell eine Liste von Kandidaten-Geometrien. Dieser Vorgang wird als erster Durchgang bezeichnet.

In einem zweiten Durchgang wird die Liste der Kandidaten-Geometrien überprüft, und alle Geometrien mit Envelopes, die nicht das Feld schneiden, werden aussortiert.

In einem dritten Durchgang werden die tatsächlichen Koordinaten der Kandidaten-Geometrie mit dem Feld verglichen, um festzustellen, ob die Geometrie das Feld schneidet. Dieser letzte komplexe Vergleichsprozess wird für eine durch die ersten beiden Prozesse erheblich verringerte Teilmenge von Tabellenzeilen ausgeführt.

Bei allen räumlichen Abfragen werden die drei Durchgänge ausgeführt, außer bei der Funktion "EnvelopesIntersect", die nur die ersten beiden Durchgänge ausführt. Die Funktion "EnvelopesIntersect" wurde zum Anzeigen von Vorgängen entwickelt, die Ausschneideroutinen für Anzeigetreiber verwenden und nicht die Genauigkeit des dritten Durchgangs benötigen.

Optimale Gitterzellengrößen

Die Auswahl der Gitterzellengröße ist kompliziert, da Envelopes von ungleichmäßig geformten Geometrien nicht genau in die Gitterzelle passen. Aufgrund dieser Ungleichmäßigkeit schneiden einige Geometrien mehrere Gitter, während andere in eine einzelne Gitterzelle passen. Außerdem können auch Gitterzellen mehrere Geometrie-Envelopes schneiden, je nach der räumlichen Aufteilung der Daten.

Ein räumlicher Index funktioniert gut, wenn Sie die richtige Anzahl an Ebenen und die entsprechenden Gitterzellengrößen für die Daten aktivieren. Zur Vereinfachung wählen Sie von Anfang an eine räumliche Spalte, die gleich große Geometrien enthält. In diesem Fall müssen Sie keinen räumlichen Index mit mehreren Ebenen erstellen, da eine einzige Gitterebene ausreichend ist. Erstellen Sie einen räumlichen Index mit einer einzigen Gitterebene, deren Gitterzellengröße beim 1,5-fachen der Größe des durchschnittlichen Geometrie-Envelopes liegt.

TippTipp:

Da Punktdaten einen kleinen Envelope haben, kann auch die Gittergröße klein sein.

Generell sollte die Gittergröße etwa ein Zehntel der typischen Fenstergröße für Abfragen betragen. Für Punktdaten sollte eine einzige Gitterebene ausreichen.

Beim Testen Ihrer Anwendung stellen Sie eventuell fest, dass sich die Leistung mit einer größeren Gitterzellengröße verbessert, da sich dadurch jede Gitterzelle auf mehr Geometrien bezieht, sodass im ersten Durchgang nicht zutreffende Geometrien leichter aussortiert werden können. Wenn Sie jedoch die Gitterzellengröße immer weiter erhöhen, verschlechtert sich die Leistung, da die Anzahl der im zweiten Durchgang gefilterten Geometrien ansteigt.

DB2 Spatial Extender verfügt über das Dienstprogramm Index Advisor, mit dem Sie einen simulierten Gitterindex erstellen können. Diesen Index können Sie als Modell für den echten Index verwenden. Das Programm stellt ebenfalls fest, ob ein bestehender Gitterindex erhalten bleiben oder ersetzt werden sollte.

Nachstehend finden Sie ein Beispiel für die Verwendung von Index Advisor zum Erhalt detaillierter Informationen zu einem bestehenden Gitterindex. In diesem Beispiel ist der vollständig qualifizierte Name des Gitterindexes "mydb.myindex":

gseidx connect to mydb user test using test get geometry statistics for index mydb.myindex detail

Sowohl "shp2sde" als auch "cov2sde" verwenden einen ähnlichen Algorithmus zur Berechnung des räumlichen Standard-Indexes für die Gittergröße der Ebene 1, wenn die Option "–g" nicht vorhanden ist. Die Standardeinstellungen für die Gittergröße der Ebenen 2 und 3 sind immer ZERO, wobei "shp2sde" auf der Ausdehnung des Shapefiles basiert und "cov2sde" auf der Ausdehnung des ArcInfo-Coverages. Weitere Informationen zur Verwendung der Befehle "shp2sde" und "cov2sde" finden Sie in der mit ArcSDE installierten ArcSDE Administration Command Reference.

Auswählen der Anzahl der Ebenen

Wenige räumliche Spalten enthalten Geometrien derselben relativen Größe. Allerdings können Geometrien der meisten räumlichen Spalten in Größenintervalle eingeteilt werden. Denken Sie beispielsweise an eine räumliche Spalte mit Landkreis-Flurstücken mit einer großen Anzahl kleiner Flurstücke in Stadtgebieten, die von einigen großen ländlichen Flurstücken umgeben sind. Diese Situation kommt häufig vor und erfordert die Verwendung eines räumlichen Indexes mit mehreren Ebenen. Um die Gitterzellengrößen jeder Ebene zu wählen, bestimmen Sie die Intervalle der Größen der Geometrie-Envelopes. Erstellen Sie einen räumlichen Index, bei dem die Zellengrößen der Gitterebene etwas größer als die einzelnen Intervalle sind. Überprüfen Sie den Index, indem Sie mit Ihrer Anwendung Abfragen für die räumliche Spalte vornehmen. Probieren Sie geringfügige Anpassungen der Gittergrößen nach oben oder unten aus, um festzustellen, ob dadurch die Performance verbessert werden kann.

Weitere Informationen zu diesem Thema finden Sie in Kapitel 11, "Indizes und Sichten für den Zugriff auf räumliche Daten verwenden", im IBM DB2 Spatial Extender Benutzer- und Referenzhandbuch.


3/6/2012