berechnete Spalten, Index, Clustered Index und Covering Index?

7

Wir alle wissen, dass wir nur eine Clusteransicht pro Tabelle haben können, cool. Aber anscheinend haben Sie keine Werte für berechnete Spalten auf Blatt, selbst wenn Sie einen Clustered-Index verwenden, und sie werden jedes Mal berechnet.
Meine erste Frage ist also, ist das richtig, was ich gerade gesagt habe?

Wenn Sie einen Clustered-Index erstellen, zitieren Sie mich einfach.
"Wenn Sie einen Clustered-Index für eine berechnete Spalte erstellen, sind die Werte der Spalte physisch in den entsprechenden Tabellenzeilen vorhanden, da Blattseiten des Clustered-Index enthalten Datenzeilen. "
Ja, okay, aber warum sollte ein Clustered-Index nur für berechnete Spalten erstellt werden? Ich dachte, wenn Sie einen Clustered-Index für eine Spalte erstellen, sind die Daten auf Blatt vorhanden?
Meine Frage 2 lautet also: Würde der Wert der berechneten Spalte in der Tabelle vorhanden sein (bestehen bleiben), wenn wir nur einen Clustered-Index für diese bestimmte Spalte erstellen würden? (Frage 2 fährt fort) Wenn dies tatsächlich der Fall ist, was ist, wenn wir mehr als eine berechnete Spalte haben? Sicherlich können wir nicht mehr als einen Clustered-Index erstellen. Wie können wir ihren Wert dauerhaft machen?

Was ist nun mit den Deckungsindizes? Erstens müssen wir beim Erstellen eines Clustered-Index keinen Deckungsindex abdecken (oder wir können ihn nicht wirklich erstellen), da sich alle Daten bereits auf Blatt befinden würden, oder? Es macht also keinen Sinn, eine andere Spalte aufzunehmen?
Drittens möchte ich fragen, ob ich mit dem, was ich gerade in meiner vorherigen Aussage gesagt habe, richtig bin.

Wenn wir nun einen Deckungsindex erstellen (nicht gruppiert, oder?) Und die berechneten Spalten einschließen, würden wir sie dann beibehalten? Würden sie "physisch gespeichert" oder erneut berechnet? (und das war übrigens meine 4. Frage.)

Schließlich (5. Frage): Wenn wir auf all diese Arten dasselbe erreichen können (berechnete Spalten beibehalten) (oder auf einige dieser Arten weiß ich nicht wirklich, welche, deshalb stelle ich die Frage an erster Stelle!). Was wäre dann die beste Methode und warum?

ps: Es tut mir leid, wenn ich nur einmal 5 Fragen gestellt habe, aber sie sind alle schrecklich verwandt, und ich wollte nicht immer und immer wieder dasselbe in 5 verschiedenen Fragen stellen. Ich hoffe, Sie verstehen! :) :)

BEARBEITEN: Nun, als Antwort auf Kommentare verwende ich derzeit SQL Server 2008, aber wenn Sie angeben könnten, wie sich die Situation ändern würde, wenn Sie etwas anderes (mein SQL oder was auch immer) verwenden, wäre dies nicht nur für mich, sondern auch für die Community von Vorteil . :) :)

Razort4x
quelle

Antworten:

4

Berechnete Spalten können auf zwei Arten auf der Datenseite gespeichert werden. Entweder durch Erstellen als PERSISTEDoder durch Einfügen in die Clustered-Index-Definition.

Wenn sie in der Clustered-Index-Definition enthalten sind, werden PERSISTEDdie Werte auch dann in jeder Zeile gespeichert, wenn die Spalten nicht als markiert sind . Diese Indexschlüsselwerte werden zusätzlich auf den Seiten der oberen Ebene gespeichert.

Wenn die berechnete Spalte ungenau (z. B. float) oder nicht als deterministisch (z. B. CLR-Funktionen) überprüfbar ist, muss die Spalte als gekennzeichnet PERSISTEDsein, um Teil eines Indexschlüssels zu werden.

Also um ein Beispiel zu geben

CREATE TABLE T
(
A INT,
C1 AS REPLICATE(CHAR(A),100) PERSISTED,
C2 AS REPLICATE(CHAR(A),200),
C3 AS CAST(A AS FLOAT) PERSISTED,
C4 AS CAST(A + 1 AS FLOAT)
)

CREATE UNIQUE CLUSTERED INDEX IX ON T(C2,C3)
  • C1wird nur in den Datenseitenzeilen gespeichert, da diese als markiert, PERSISTEDaber nicht indiziert sind.
  • C2 wird sowohl in den Zeilen auf der Datenseite als auch in den höheren Indexebenen gespeichert, da es sich um eine Indexschlüsselspalte handelt.
  • C3wird wie für gespeichert C2. Es ist imprecisejedoch erforderlich, es als zu kennzeichnen PERSISTED.
  • C4wird nirgendwo gespeichert, da es weder als markiert PERSISTEDnoch indiziert ist.

In ähnlicher Weise müssen alle berechneten Spalten, auf die in nicht gruppierten Indexdefinitionen als Schlüsselspalten verwiesen wird, auf allen Ebenen des Index gespeichert werden, da sie Teil des Indexschlüssels sind. Es gibt die gleiche Anforderung hinsichtlich präziser / deterministischer Ergebnisse.

Schlägt fehl

CREATE NONCLUSTERED INDEX IX2 ON T(A,C4)

Mit dem Fehler.

Index oder Statistik 'IX2' für Tabelle 'T' kann nicht erstellt werden, da die berechnete Spalte 'C4' ungenau ist und nicht beibehalten wird. Ziehen Sie in Betracht, die Spalte aus dem Index- oder Statistikschlüssel zu entfernen oder die berechnete Spalte weiterhin zu markieren.

Um es als Teil des nicht gruppierten Indexschlüssels aufzunehmen, muss es auch auf den gruppierten Indexdatenseiten gespeichert werden. jedoch

Gelingt es.

CREATE NONCLUSTERED INDEX IX2 ON T(A) INCLUDE (C4)

Berechnete Spalten, bei denen es sich nur um INCLUDEd-Spalten handelt, bleiben auf der NCI-Blattseite erhalten und müssen nicht auch auf der Datenseite beibehalten werden.

Martin Smith
quelle