Nicht gruppierte eindeutige Indizes auf SQL Server-Partitionen

7

Für SQL Server 2008 sind eindeutige, nicht gruppierte Indizes erforderlich, die auf einer Partition erstellt wurden, um das Partitionsfeld in die Indexdefinition aufzunehmen.

Ich frage mich warum.

bmk
quelle

Antworten:

7

Kurze Antwort:

Wenn der Clustering-Schlüssel nicht Teil des Schlüsselsatzes wäre, könnte die Eindeutigkeit des Index über alle Partitionen hinweg nicht garantiert werden.

Die lange Geschichte:

Die einzige Möglichkeit, die Eindeutigkeit zu gewährleisten, besteht darin, die Eindeutigkeit über eine B-Tree-Struktur zu erzwingen. Mit einem B-Baum ist es wirklich einfach, die Eindeutigkeit zu erzwingen, da jeder Schlüssel eine deterministische logische Position im B-Baum hat (zwischen seinem linken Nachbarn, dh einem kleineren Schlüssel, und dem rechten Nachbarn, der ein größerer Schlüssel ist). Da jeder Schlüsselwert an einer einzelnen Position im Baum eingefügt werden kann, kann die Eindeutigkeit leicht garantiert werden: Überprüfen Sie beim Einfügen einfach, ob die Position bereits von einer vorhandenen Zeile belegt ist.

Die Eindeutigkeit der Partitionierung über alle Partitionen hinweg ist schwieriger, da viele B-Tree-Strukturen beteiligt sind (eine für jede Partition). Jeder kann die Eindeutigkeit innerhalb einer Partition garantieren, aber zusammen können sie nicht die globale Eindeutigkeit über alle Partitionen hinweg garantieren: Ein Schlüssel in Partition X kann auch in Partition Y erscheinen. Um die Semantik des "eindeutigen Index" beizubehalten, muss die Clustering-Spalte daher beibehalten werden Sei ein Teil des Schlüssels. Auf diese Weise ist jeder Schlüsselwert deterministisch an eine bestimmte Partition gebunden: Ein Schlüssel kann nicht in Partition X und Y angezeigt werden, da die Partitionierungsspalte Teil des Schlüssels ist und der Schlüssel daher genau zu Partition X oder Y gehören kann.

@MarkStoreySmith fragte: Warum überprüft SQL Server die Eindeutigkeit nicht, indem er durch die einzelnen B-Baum-Strukturen navigiert, Bereichssperren abruft, in denen der zu testende Wert nicht vorhanden ist, und hält, bis jeder B-Baum durchlaufen wurde? Die Suche nach jedem B-Tree wäre ein Leistungsproblem (denken Sie an 15.000 Partitionen, die bei jeder Einfügung überprüft werden müssen). Und auch die Verriegelungskomplikationen (Hüpfen von einem B-Baum zum nächsten) sind erheblich, mit einem enormen Potenzial für Deadlocks.

Remus Rusanu
quelle
1
"Da es sich um viele B-Tree-Strukturen handelt ..." ist meiner Meinung nach der eigentliche Schuldige. Wenn ich einen eindeutigen Index ohne das partitionierte Feld möchte, sollte ich nicht gezwungen werden, das partitionierte Feld einzuschließen.
BMK
1
@bmk: dann erstelle einen nicht partitionierten eindeutigen Index :) Ich verstehe, dass es keine perfekte Lösung gibt (auf Wiedersehen, schneller Partitionswechsel!), aber dies ist (einer von) dem Preis, den Sie zahlen, wenn Sie sich für die Partitionierung entscheiden. Ist kein kostenloses Mittagessen, und der "Preis" ist tatsächlich deutlich höher als die meisten erkennen. Und wie Sie sehen, kann der Preis tatsächlich bis zum Datenmodell durchdringen (der Primärschlüssel muss eine Partitionierungsspalte enthalten), was enorme Auswirkungen auf die ORM-Schicht usw. usw. hat. Ich empfehle immer eine sorgfältige Überlegung, wenn Sie über eine Partitionierung nachdenken.
Remus Rusanu
0

Sie können den nicht gruppierten Index erstellen, um die Partition auszurichten oder nicht.

Wenn Sie den Ausrichtungspartitionsindex erstellen, ist in SQL Server 2005 die abgelegte Partition die letzte Datei, die auf der Indexblattseite abgelegt wurde, jedoch nicht in den Anweisungen create. Ich habe dies überprüft, indem ich 'dbcc page' ausgeführt habe.

Glück7_2000
quelle
Entschuldigung, ich bin mir nicht sicher, ob ich verstehe, was Sie erklären.
BMK
0

Dies kann einfach daran liegen, dass der Index an den Partitionen ausgerichtet werden muss, da der Index selbst partitioniert werden muss (dh an separaten Speicherorten auf dem Laufwerk gespeichert werden muss). Wenn der Index nicht ausgerichtet ist, gibt es partitionübergreifende Zeiger.

Knitterfrei
quelle