2016-07-13 14 views
2

Ich berechne die Entfernung zwischen zwei 2 Punkten (mit ihren GPS-Koordinaten) aus der folgenden Abfrage (Abfrage 1). Eine Spalte meiner Tabelle speichert die geo_location von point1 und die Position von point2 wird dynamisch in bind Variable bereitgestellt. Die Abfrage funktioniert gut und gibt mir den genauen Abstand zwischen Punkt1 und Punkt2. Ich sehe jedoch eine hohe CPU-Auslastung auf dem DB-Server (von 60% bis zu 95% manchmal), wenn diese Abfrage ausgeführt wird. Als ich versuchte, den AWR-Bericht zu scannen, stellte ich fest, dass eine weitere Abfrage (Abfrage 2 unten) intern ausgelöst wird und diese Abfrage jede Zeile (für jede Ausführung von Abfrage1) in der Tabelle unabhängig von der WHERE-Klausel durchsucht (ich suche für Zeilen mit einem bestimmten Text, für den nur die Entfernung berechnet werden muss! Ich habe versucht, die Textsuche als Unterabfrage (Query3), so dass diese sdo_nn nur auf diese Teilmenge aber vergeblich läuft. Wenn 15k Datensätze in der Tabelle vorhanden sind und wenn Abfrage 1 2k mal ausgeführt wird, dann ist die Anzahl der Ausführungen von Abfrage 2 von AWR 15k * 2k mal! Ich benutze Oracle 11g. Fordern Sie Ihre Hilfe an. Implementiere ich die sdo_nn-Funktionalität richtig? Gibt es eine Möglichkeit, die ich implementieren kann, um Query2 zu vermeiden?Räumliche Oracle-Abfrage mit dem Operator sdo_nn

Query1: 
SELECT geo_location, Sdo_Nn_Distance (1) distance FROM my_table a WHERE SDO_NN(a.GEO_LOCATION, SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE (:7 , :8 , NULL), NULL, NULL), 1) = 'TRUE') AND (contains(a.col1, :9) > 0 ORDER BY DISTANCE; 

Bind Variable in obiger Abfrage darstellt:

: 7 Länge Eingänge

: 8 Breiteneingänge

: 9 Suchtext Eingänge

Query2: 
SELECT a."GEO_LOCATION" FROM my_table a where a.rowid=:rid 

Query3: 
SELECT geo_location, Sdo_Nn_Distance (1) distance FROM my_table a WHERE SDO_NN(a.GEO_LOCATION, SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE (:7 , :8 , NULL), NULL, NULL), 1) = 'TRUE') AND a.col1 in (select col1 from my_table where (contains(a.col1, :9) > 0) ORDER BY DISTANCE; 
+0

Wir haben das spezifische Problem in ROWID gelöst, indem wir beim Erstellen des Index den Parameter layer_gtype hinzugefügt haben! –

Antwort

1

Zum Zweck des Lesers Ich poste diese Antwort erneut: Die Lösung, die das Problem gelöst hat, wurde hinzugefügt ein Parameter 'layer_gtype = POINT' beim Erstellen des Indexes!

Verwandte Themen