Freitag, 18. November 2016

Punkte in Linien konvertieren - Ein performanter und einfacher Lösungsansatz

In diesem Blog Posting möchte ich einen einfachen Ansatz zum Konvertieren von Punkten in Linien vorstellen. Dieser basiert auf einem Vorschlag von H-J Deicher, dem an dieser Stelle der Dank gilt.

Ausgangssituation ist eine Tabelle mit Punkten (POINTS). Über einen Schlüsselwert (TRACK_ID) sowie einem Wert für die Reihenfolge (ORDER_ID) sollen die Punkte zu Linien zusammengefasst und als Geometrien in eine Tabelle (LINES) geschrieben werden.

Derzeit gibt es noch keine native POINTSTOLINE Funktion in Oracle Locator bzw. Spatial and Graph. Aber ein SELECT Statement mit INSERT in die Ziel-Tabelle kann Abhilfe schaffen.
insert into lines (track_id, geom)
select l.track_id, l.geom
from (
  select  p2.track_id,
          sdo_geometry (
            2002, 3785, null,
            sdo_elem_info_array(1,2,1),
            cast (
              multiset (
                select t.column_value
                from points p1,
                     table (
                       sdo_ordinate_array(p1.geom.sdo_point.x, p1.geom.sdo_point.y)
                     ) t
                where p1.track_id = p2.track_id
                order by p1.order_id, rownum
              )
              as sdo_ordinate_array
            )
          ) as geom
  from points p2
  group by p2.track_id
  order by p2.track_id
) l;
Ohne irgendwelche Optimierungen bereits im Blick zu haben, werden auf diese Weise
  • in 40 Sekunden
  • 61.440 Tracks
  • aus 12.283.904 Punkten
  • auf einem Standard-Laptop mit lokaler Oracle DB 12.1.0.1 Instanz
generiert und persistiert.

Worauf ist zu achten, um wirklich performant zu sein?
  • Für die Punkt-Tabelle wurde ein zusammengesetzer Index auf die Spalten TRACK_ID und ORDER_ID gelegt.
  • Es ist immer empfehlenswert, dem Optimizer aktuelle Statistiken anzubieten.
  • Die Zieltabelle kann NOLOGGING gesetzt werden.
Welche Optimierungsansätze für möglichst noch bessere Performance gibt es?
  • Ein erster Ansatz ist, mit Parallelisierung zu arbeiten.
  • Wenn sehr viele Punkte zu jeweils einem Track gehören, kann auch die Partitionierung der Punkt-Tabelle auf Basis der TRACK_ID sinnvoll sein.
Probieren Sie es einfach aus. Ich bin auf Ihre Ergebnisse gespannt.


Keine Kommentare:

Kommentar veröffentlichen