Ich versuche, hierarchyID in einer Tabelle (dbo. [Nachricht]) zu implementieren, die etwa 50.000 Zeilen enthält (wird in Zukunft wesentlich wachsen). Es dauert jedoch 30-40 Sekunden, um ungefähr 25 Ergebnisse zu erhalten.Frage zu SQL Server HierarchyID Tiefe erste Leistung
Der Wurzelknoten ist ein Füller, um Eindeutigkeit zu gewährleisten, daher ist jede nachfolgende Zeile ein Kind dieser Dummy-Zeile.
Ich muss in der Lage sein, die Tabelle depth-first durchlaufen und haben die Hierarchie-ID-Spalte (dbo. [Nachricht] .MessageID) der Clustering-Primärschlüssel, auch eine berechnete smallint (dbo. [Nachricht] .Hierarchie) welche die Ebene des Knotens speichert.
Verwendung: Eine .Net-Anwendung durchläuft einen hierarchyID-Wert in der Datenbank und ich möchte in der Lage sein, alle (falls vorhanden) untergeordneten UND-Eltern dieses Knotens (neben der Wurzel, wie es ist Füllstoff) abrufen.
Eine vereinfachte Version der Abfrage ich verwende:
@MessageID hierarchyID /* passed in from application */
SELECT
m.MessageID, m.MessageComment
FROM
dbo.[Message] as m
WHERE
m.Messageid.IsDescendantOf(@MessageID.GetAncestor((@MessageID.GetLevel()-1))) = 1
ORDER BY
m.MessageID
Von dem, was ich verstehe, sollte der Index ohne einen Hauch automatisch erkannt werden.
Aus der Suche in Foren habe ich Leute gesehen, die Index-Hinweise verwenden, wenn sie mit breast-first-Indizes umgehen, aber diese Anwendung nicht in der ersten Tiefe beobachtet haben. Wäre das ein relevanter Ansatz für mein Szenario?
Ich habe in den letzten paar Tagen versucht, eine Lösung für dieses Problem zu finden, aber ohne Erfolg. Ich wäre sehr dankbar für jede Hilfe, und da dies meine erste Post ist, entschuldige ich mich im Voraus, wenn dies eine 'noobish' Frage wäre, habe ich die MS-Dokumentation gelesen und unzählige Foren durchforstet, bin aber nicht auf eine kurze Beschreibung gestoßen des spezifischen Problems.
Übrigens, die Abfrage, die Sie haben? Wie geschrieben, wird es immer ALLE Knoten in der gesamten Tabelle auswählen. Der '@ MessageID.GetAncestor (@ MessageID.GetLevel() - 1)' nimmt es bis zur Wurzel, und dann wählen Sie alles aus, was ein Nachkomme ist, was ... alles ist. Deshalb ist es so langsam. – Aaronaught
Nur um zu verdeutlichen: meine Situation erfordert die Verwendung von Tiefen-Indizierung, sorry für Verwirrung (ich bezog sich auf Breite zuerst am Ende, um ein Beispiel zu geben, wo Leute vorgeschlagen haben, Index-Hinweise zu verwenden) – ObjectiveCat