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.
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.
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.
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.
quelle
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.
quelle