Verwendet jemand HierarchyId in der Produktion? Ist es zuverlässig?

21

Verwendet jemand HierarchyId in der realen Produktion mit Tabellen mit einer vernünftigen Größe von mehr als ein paar tausend Zeilen? Ist es zuverlässig / performant? Bisher habe ich noch niemanden gefunden, der nicht mit dem Anbieter verbunden ist, und Paul Nielsen rät hier davon ab .

Wie sind Ihre Erfahrungen mit der Verwendung von HierarchyId in tatsächlichen Produktionssystemen?

Welche Kriterien haben Sie verwendet, als Sie HierarchyId anstelle der Alternativen ausgewählt haben?

AK
quelle

Antworten:

8

Ich habe HierarchyID implementiert und festgestellt, dass es eine gute Leistung bietet und einfach zu bedienen ist.

Ich habe es für relativ kleine Datensätze (Zehntausende von Zeilen) mit einer Hierarchie von bis zu 10 Verzweigungen verwendet.

Warum es benutzen? Der HierarchyID-Typ bietet eine Reihe von Hilfsmethoden (z. B. IsDescendantOf), die Ihre Arbeit einfacher machen als das Rollen Ihres eigenen materialisierten Pfads.

Paul Nielsens Kommentar zu StackOverflow ist für mich verwirrend - die HierarchyID ist ein materialisierter Pfad. Ich bin eher geneigt, diesem Kommentar unter seiner Antwort zuzustimmen .

Eine bessere Frage könnte sein, warum man es nicht benutzt. Es ist einfach zu bedienen, bietet viele Funktionen, die Sie sonst für sich selbst schreiben würden, und funktioniert gut (in meinen begrenzten Tests).

Kirk Broadhurst
quelle
+1 Wie stellen Sie die Integrität Ihrer Daten sicher? Können Sie mithilfe von Einschränkungen sicherstellen, dass keine Waisenkinder vorhanden sind?
AK
3
Aus dem Gedächtnis können Sie. Sie würden eine Funktion in der HierarchyID verwenden, um den übergeordneten Wert zu bestimmen, eine persistierte berechnete Spalte für diesen Wert zu erstellen und dann eine FK-Einschränkung zwischen diesem Wert und dem übergeordneten Wert anzuwenden.
Kirk Broadhurst
5

Dies ist eine Antwort auf Kirks Frage, warum man es nicht benutzt (HierarchyId). Im Vergleich zu materialisierten Pfaden scheint HierarchyId in einigen wichtigen Fällen weniger performant und weniger benutzerfreundlich zu sein.

Der Grund ist einfach: unter Angabe von Microsoft Kommentar zu Connect , „Das Problem ist , dass die CLR Anrufe, einschließlich hierarchyid Methoden sind undurchlässig für den Abfrageoptimierer von Entwurf ist jedoch bedeutet dies , dass die Mächtigkeit Schätzung für sie manchmal recht sein kann.. falsch."

Andererseits ist das Implementieren von materialisierten Pfaden beim ersten Mal sehr einfach, und beim nächsten Mal ist es im Wesentlichen eine Aufgabe zum Kopieren und Einfügen. So erhalten wir mit sehr wenig Aufwand eine vielseitigere und leistungsfähigere Lösung.

Daher stimme ich Paul Nielsen voll und ganz zu, der in seinem hervorragenden Buch "Microsoft® SQL Server® 2008 Bible" Folgendes geschrieben hat: "Die neue HierarchyID ist nicht unumstritten. Sie ist neu und erhält viel Zeit für Presse und Demo, aber ich ' Ich bin mir nicht sicher, ob es ein Problem ist, das eine andere Lösung benötigt. "

AK
quelle
3

Mein Unternehmen verwendet HeirachyID in mehrstufiger Marketing-Software für den Direktvertrieb. Es klappt. Ich habe nicht wirklich damit gearbeitet, ich weiß nur, dass wir es verwenden.

Das größte Problem, das ich dabei gesehen habe, ist, dass wir die Ebenen in einer Schleife durchlaufen, anstatt mehr satzbasiert zu sein. In diesem Bereich funktioniert es für uns nicht wirklich gut, aber ich bin mir nicht sicher, ob das ein Problem mit dem Typ oder unserer Implementierung ist.

Jack Corbett
quelle
Jack, wie groß sind deine Tische? Wie haben Sie sich entschieden, HierarchyId anstelle seiner Alternativen zu verwenden?
AK
Da ich keine E-Mail-Benachrichtigung aktiviert hatte, habe ich diesen Kommentar nie gesehen. Unsere Tische sind zu Hunderttausenden im Moment keine Millionen. Ich war nicht bei der Firma, als die Entscheidung getroffen wurde, HierarchyID zu verwenden, daher bin ich mir nicht sicher, warum es ausgewählt wurde, außer es war zu der Zeit der neue Weg.
Jack Corbett
1

Ein Problem mit hierarchyid ist, dass Sie eine Lieferantenbindung erhalten. Aber ich habe einen großartigen Artikel von Adam Milazzo darüber gefunden, wie alles intern funktioniert:

http://www.adammil.net/blog/view.php?id=100

Damit konnte ich ein Postgres-Skript schreiben, um meinen Datensatz von MSSQL zu konvertieren. Enthält es auch in einem Skript, das ich geschrieben habe, um die AdventureWorks-Datenbank in Postgres zu importieren:

https://github.com/lorint/AdventureWorks-for-Postgres

Suchen Sie einfach in der Datei install.sql nach "hierarchyid", und Sie werden bald Hinweise zur Konvertierung finden.

Lorin Thwaits
quelle
0

Unser Team hat es in der Produktion implementiert, zunächst ist die Leistung gut, nach 2 Jahren enthält die Tabelle nun 430.000 Zeilen und getroot und getdecendent dauert 3 Sekunden. Beide werden für die Berechnung des nächsten ID-Werts zum Einfügen eines Datensatzes benötigt. Jetzt dauert das Einfügen eines einzelnen Teilbaums ungefähr 16 Sekunden, was überhaupt nicht akzeptabel ist.

Gavin
quelle