2009-08-28 5 views
7

Im Moment habe ich eine Seite mit einer Tabelle, die Breite/Länge float-Spalten hat, und einen Index über diese zwei Spalten und eine andere I abrufen müssen.Kann ich in SQL Server 2008 den Index "Covering, Spatial" erstellen?

Ich frage ständig diese Tabelle, um die Zeilen zu erhalten, die innerhalb eines Radius von einem bestimmten Punkt fallen (ich bekomme eigentlich ein Quadrat für die Geschwindigkeit), aber ich brauche nur die Felder, die bereits indiziert sind, also diesen Index in der Tat Abdeckung ist, und der Ausführungsplan hat nur 2 Schritten:

Index Seek (cost: 100%) and SELECT (cost: 0%) 

Nun, ich versuche, die Vorteile der räumlichen Funktionen von SQL zu nehmen 2008. ich die Geographie Spalte erstellt haben, füllte es, erstellt der räumliche Index, die Werke.

Und alles funktioniert gut, außer dass der Ausführungsplan eine Million Schritte hat und 74% der Zeit für einen Clustered Index Seek ausgegeben wird, wo er die im Spatial Index gefundenen Zeilen mit der tatsächlichen Tabelle verbindet. den Rest der Daten ...
(Spatial Index Seek nimmt 1% der Ausführungsplan Kosten)

Also, anscheinend zu bekommen, es den räumlichen Index in geeigneter Weise verwendet, und die Datensätze zu finden, ich brauche viel schneller als Vorher mit meinem "normalen" Index über Lat/Long, aber der Beitritt zur Haupttabelle bringt mich um, die Spatial-Abfrage dauert 7 mal so lang wie meine alte.

Gibt es eine Möglichkeit mehr Spalten zur räumlichen Index hinzufügen, so dass es zu verdecken werde und es kann in einem Schritt der Dinge tun, so wie es vor tat?
Gibt es andere Dinge, die ich tun könnte, um diese Situation zu verbessern?


UPDATE: Ich fand, dass „normale“ Indizes andere Spalten mit INCLUDE Stichwort „include“ kann (was ich nichts wusste, habe ich zu zählen nur die Spalten im Index selbst)
Nach zu der Dokumentation here, diese Klausel ist keine Option für Räumliche Indizes ... Irgendwelche Ideen?

Danke!
Daniel

Antwort

4

Nein, leider gibt es derzeit keine Möglichkeit, eine Abdeckung räumlichen Index zu erstellen - die Abfrage wird den Lesezeichen-Lookup der Basistabelle, um die Geographie Wert für die Reihe zu bekommen immer tun.

Für STIntersects, dies eindeutig erforderlich ist, immer als wir noch die Sekundärfilter auf dem tatsächlichen Geographie Objekt ausführen müssen, um sicherzustellen, dass es tatsächlich die Parameter Objekt überschneidet. Wenn Sie jedoch keine genauen Antworten benötigen und Filter() verwenden können, ist es möglich, die Primärschlüsselspalten aus dem Index bereitzustellen, ohne die Basistabelle überhaupt zu durchsuchen. Dies zu unterstützen ist etwas, das wir für die nächste Version in Betracht ziehen.

Im Hinblick auf die Beschleunigung Ihrer aktuellen Abfrage, haben Sie versucht, mit Filter() und Ihr Index mit der Ausgabe von sp_help_geography_index Tuning?