Ich habe versucht, indizierte Ansichten zu verwenden, um die Leistung einiger unserer am häufigsten verwendeten Ansichten zu steigern.
Indizierte Ansichten unterstützen jedoch keine nicht eindeutigen Clustered-Indizes, was ein wenig gegen die vom Rest der Datenbankstruktur festgelegte Priorität verstößt.
Hier ist zum Beispiel eine vereinfachte Version einiger unserer Tabellen.
-Groups-
Group ID GroupName
-Users-
UserKey UserName FullName GroupID
Die Indizes befinden sich auf Groups.GroupID (nicht gruppiert) und Users.GroupID (gruppiert). Der Clusterschlüssel, der sich in der Tabelle "Benutzer" in der Gruppe "ID" befindet, da am häufigsten ein Bereich von Benutzern aus einer bestimmten Gruppe abgerufen wird. Offensichtlich hätten Sie mehrere Benutzer pro Gruppe, sodass dieser Clustered-Index nicht eindeutig ist.
Dies lässt mich ein wenig unsicher, wie ich dieser Priorität beim Indizieren meiner Ansichten wie diesem Beispiel folgen soll, da ich keinen nicht eindeutigen Clustered-Index haben kann.
ConsumableID ConsumableVariantID AllowThresholdOverwrite FullPath GroupID ManufacturerID Type ModelID
101 29 1 0.1.2.4. 4 3 3 2
Tatsächlich ist der einzige Wert in dieser Ansicht, der immer eindeutig wäre, die Spalte ConsumableID, sodass ich keine andere Wahl habe, wo ich meinen Index platzieren soll.
Warum erlauben Ansichten keine nicht eindeutigen Clustered-Indizes, wenn dies bei regulären Tabellen der Fall ist?
quelle
(GroupID, UserID)
. Beschränken Sie sich nicht auf eine einzelne Spalte für den Schlüssel. 2 - Ich stelle mir vor, dass die Einschränkung für eine Ansicht darin besteht, dass dies ein zusätzliches Datenobjekt ist, für das Zeilen leicht mit den NC-Indizes verknüpft werden müssen. Für eine Tabelle wird dem nicht eindeutigen CI-Schlüssel ein int angehängt, aber ich denke, dass dies bei einer indizierten Ansicht schwieriger wäre, da es sich nicht um eine tatsächliche Tabelle handelt, sondern eine tatsächliche Tabelle reflektieren muss.Antworten:
Die folgende Erklärung wird in diesem technischen Artikel von Microsoft gegeben :
SQL Server verwendet ein Delta-Algebra-System, um indizierte Ansichten mit den Basisdaten Schritt zu halten. Außerdem werden für jede DML-Abfrage, die eine oder mehrere indizierte Ansichten betrifft, automatisch Abfrageplanoperatoren für die Ansichtsverwaltung integriert. Ein eindeutiger Clustered-Index in der Ansicht vereinfacht die Implementierungsdetails erheblich.
Die aktuelle Anordnung ermöglicht die Integration von Formen des Wartungsoperatorbaums mit fester Form in den Basis-DML-Abfragebaum, wodurch eine Orthogonalität bereitgestellt wird, die auch das Testen vereinfacht. Letztendlich könnten indizierte Ansichten eines Tages erweitert werden, um nicht eindeutige Clustered-Indizes zu unterstützen. Andererseits sind alle Dinge bei unbegrenzter Zeit und unbegrenzten Ressourcen möglich (beides gilt zum Zeitpunkt des Schreibens nicht für das SQL Server-Entwicklungsteam).
Ein Beispiel, das zeigt, wie komplex das Erstellen von Aktualisierungsabfrageplänen werden kann und wie leicht sich subtile Fehler einschleichen können, finden Sie in diesem Beispiel eines Fehlers , der bei
MERGE
indizierten und gefilterten Indizes auftritt (eine Funktion, die eine enge Verbindung zu indizierten Ansichten aufweist).quelle
GROUP BY
Klausel enthält, aber nicht alle Gruppierungsausdrücke Schlüssel im Clustered-Index sind. Es ist gültig ab SQL Server 2014.In SQL Server müssen alle Indexschlüssel intern eindeutig sein. Dies ist erforderlich, um Sperrschlüssel zu erhalten, die genau eine Zeile adressieren. Es ist auch für die Indexpflege erforderlich. Stellen Sie sich eine NCI in einer Spalte vor, die nur einen Wert enthält (100% Duplikate). Wenn eine Zeile aus der Tabelle gelöscht wird, muss die Speicher-Engine die entsprechende NCI-Zeile finden und ebenfalls löschen. Wenn alle NCI-Zeilen nicht unterscheidbar sind, wäre dies unmöglich.
Sie sehen also, dass das CI in einer Ansicht (intern) eindeutig sein muss, damit die Engine funktioniert.
Wenn Sie einen Index nicht eindeutig machen, macht SQL Server ihn intern immer noch eindeutig. Bei einer NCI in einer Heap-Tabelle wird das Zeilenlesezeichen angehängt. Bei einem nicht eindeutigen CI wird eine Eindeutigkeitsspalte hinzugefügt. Bei einem NCI in einer Tabelle mit einem CI werden alle CI-Schlüsselspalten angehängt, die Sie selbst noch nicht angegeben haben (dies kann den Eindeutiger einschließen).
Es gibt keine offensichtliche Spalte, die im Falle einer indizierten Ansicht angehängt werden könnte. SQL Server kann dies also nicht automatisch tun.
Normalerweise ist es für einen Menschen ziemlich offensichtlich, welche Spalten Sie hinzufügen können, damit die Ansicht über einen eindeutigen Satz von Spalten verfügt, die im CI verwendet werden können. Dies sind normalerweise die PK- oder CI-Spalten einer der zugrunde liegenden Tabellen. Wenn die Ansicht einen
GROUP BY
hat, indizieren Sie normalerweise die Gruppierungsschlüssel.quelle