Ich versuche, die neue Postgis 2.0-Funktion <-> (Geometry Distance Centroid) zu verwenden, um für jede Zeile meiner Tabelle (cosn1) die Entfernung zum nächsten Polygon derselben Klasse zu berechnen.
Ich habe versucht, den folgenden Code zu verwenden:
WITH index_query AS (
SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, g1.the_geom <-> g2.the_geom)
SELECT DISTINCT ON (ref_gid) ref_gid, ENN
FROM index_query
ORDER BY ref_gid, ENN;
Aber dann merke ich die Warnung:
Hinweis: Der Index wird nur aktiviert, wenn eine der Geometrien eine Konstante ist (nicht in einer Unterabfrage / einem Byte). zB 'SRID = 3005; POINT (1011102 450541)' :: Geometrie anstelle von a.geom
Dies bedeutet, dass der Index überhaupt nicht verwendet wird und die Abfrage fast genauso lange dauert wie vor der Verwendung von:
SELECT DISTINCT ON(g1.gid) g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)
Kann mir jemand eine Problemumgehung empfehlen, mit der ich die Leistung meiner Abfrage verbessern kann?
Vielen Dank.
nearest-neighbor
postgis-2.0
Alexandre Neto
quelle
quelle
Antworten:
Das Summen bei einigen Tests auf meinem Computer hat sich so angehört, als ob der Operator <-> nicht richtig funktioniert. Ich bin mir nicht sicher, ob das ein Fehler ist, aber es wurde ein Abstand von Null für nicht überlappende Geometrien gemeldet. Interessant nein?
Was ist mit den fairen traditionellen SQL-Abfrageoptimierungen? Da diese unerwarteten Ergebnisse mit dem Operator <-> auftreten, ersetze ich ihn durch st_centroid. Bekam viel bessere Ergebnisse in der Geschwindigkeit.
Hoffe, die Semantik mit st_overlaps bleibt gleich. Zumindest habe ich das aus der Dokumentation über <-> verstanden
Aus Dokumenten zu Postigs <->
Bei meinen Testdaten mit ~ 5.5k Polygonen wurde die Geschwindigkeit von ~ 1000 Sekunden auf ~ 5 Sekunden ohne räumliche Indizierung erhöht.
Warum sollte DISTINCT ON zum Gruppieren verwendet werden? Ich sehe einige Leute, die es benutzen, aber die Gruppe existiert nicht, um Duplikate zu beseitigen.
Ihre Abfrage mit Standard-SQL-Optimierungen ohne den eingeführten st_centroid-Fehler
Frohe Weihnachten!
quelle