Ich habe zwei Sätze von Erdmessungen aus Satellitendaten, jeweils mit Zeitfeldern (mjd für Mean Julian Date) und geografischen Positionen (GeoPoint, Spacial), und ich suche nach Übereinstimmungen zwischen den beiden Sätzen, so dass ihre Zeiten mit einem Schwellenwert von übereinstimmen 3 Stunden (oder .125 Tage) und deren Entfernungen bis zu 200 km voneinander entfernt.
Ich habe sowohl für Tabellen als auch für räumliche Tabellen Indizes für die mjd-Felder erstellt.
Wenn ich mich nur der Zeitbeschränkung anschließe, berechnet die Datenbank 100.000 Übereinstimmungen in 8 Sekunden und berechnet die Entfernungen für alle 100.000 Übereinstimmungen in dieser Zeit. Die Abfrage sieht folgendermaßen aus:
select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
Und der ausgeführte Plan ist:
Bei Sortierung lagen 9 der Entfernungen unter 200 km, es gibt also Übereinstimmungen. Das Problem ist, wenn ich die Abstandsbeschränkung hinzufüge und diese stattdessen ausführe,
select top 10 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.mjd between m.mjd-.125 and m.mjd+.125
and h.GeoPoint.STDistance(m.GeoPoint)<200000
option( table hint ( h, index(ix_MJD) ), table hint( m, index(ix_MJD) ) )
es geht für eine lange Zeit weg. Offensichtlich konnte es in 8 Sekunden 100.000 Zeitmatches finden, von denen 9 unter 200 km lagen. Der Optimierer muss also etwas suboptimales ausprobieren. Der Plan sieht ähnlich aus wie oben mit einem Filter für die Entfernungen (ich vermute).
Damit kann ich die Verwendung des räumlichen Index erzwingen:
select top 5 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0
from L2V5.dbo.header h join L2.dbo.MLS_Header m
on h.GeoPoint.STDistance(m.GeoPoint)<200000
and h.mjd between m.mjd-.125 and m.mjd+.125
option( table hint ( h, index(ix_MJD), index(ix_GeoPoint) ), table hint( m, index(ix_MJD) ) )
Das dauert dann 3 Minuten, um 5 Übereinstimmungen zu finden.
Wie kann ich das Abfrageoptimierungsprogramm anweisen, zuerst die MJD-Indexsuche und dann die räumliche Indexsuche zu verwenden (oder ist es das, was es bereits tut)? Wenn es 100.000 Übereinstimmungen mit Entfernungen in 8 Sekunden mit 9 unter 200 km berechnen kann, sollte die Addition des räumlichen Index es nicht schneller und nicht langsamer machen?
Vielen Dank für weitere Tipps oder Ideen.
EDIT: Um die Frage zu beantworten, wie der Plan ohne die Hinweise aussieht, ist dies (und es dauert ewig):
Es ist vielleicht auch erwähnenswert, dass die eine Tabelle fast 1 Million Datensätze und die andere 8 Millionen Datensätze enthält