Indizes für berechnete Spalten
Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance
Sie können Indizes für berechnete Spalten definieren, sofern die folgenden Anforderungen erfüllt sind:
- Anforderungen hinsichtlich des Besitzes
- Anforderungen hinsichtlich des Determinismus
- Anforderungen hinsichtlich der Präzision
- Anforderungen hinsichtlich des Datentyps
- Anforderungen hinsichtlich der SET-Option
Hinweis
SET QUOTED_IDENTIFIER
muss sein ON
, wenn Sie Indizes für berechnete Spalten oder indizierte Ansichten erstellen oder ändern. Weitere Informationen finden Sie unter SET QUOTED_IDENTIFIER (Transact-SQL).
Anforderungen hinsichtlich des Besitzes
Alle Funktionsverweise in der berechneten Spalte müssen denselben Besitzer wie die Tabelle aufweisen.
Anforderungen hinsichtlich des Determinismus
Ausdrücke gelten als deterministisch, wenn sie für eine bestimmte Gruppen von Eingaben stets dasselbe Ergebnis zurückgeben. Die IsDeterministic
Eigenschaft der COLUMNPROPERTY-Funktion meldet, ob ein computed_column_expression deterministisch ist.
Der computed_column_expression muss deterministisch sein. Ein computed_column_expression ist deterministisch, wenn alle folgenden Bedingungen zutreffen:
Alle Funktionen, auf die der Ausdruck verweist, sind deterministisch und präzise. Zu diesen Funktionen zählen benutzerdefinierte und integrierte Funktionen. Weitere Informationen finden Sie unter Deterministic and Nondeterministic Functions. Funktionen sind möglicherweise ungenau, wenn die berechnete Spalte ist
PERSISTED
. Weitere Informationen finden Sie unter Erstellen von Indizes für gespeicherte berechnete Spalten später in diesem Artikel.Alle Spalten, auf die der Ausdruck verweist, stammen aus der Tabelle, die die berechnete Spalte enthält.
Kein Spaltenverweis ruft Daten aus mehreren Zeilen ab. Aggregatfunktionen wie
SUM
z. B. oderAVG
abhängigkeiten von Daten aus mehreren Zeilen und würden eine computed_column_expression nicht deterministisch machen.Der computed_column_expression kann weder auf Systemdaten noch auf Benutzerdaten zugreifen.
Jede berechnete Spalte, die einen CLR-Ausdruck (Common Language Runtime) enthält, muss deterministisch und markiert PERSISTED
sein, bevor die Spalte indiziert werden kann. Ausdrücke des CLR-benutzerdefinierten Typs sind in den Definitionen berechneter Spalten zulässig. Berechnete Spalten, deren Typ ein CLR-benutzerdefinierter Typ ist, können indiziert werden, sofern der Typ vergleichbar ist. Weitere Informationen finden Sie unter Benutzerdefinierte CLR-Typen.
CAST und CONVERT
Wenn Sie auf Zeichenfolgenliterale des Datumsdatentyps in indizierten berechneten Spalten in SQL Server verweisen, wird empfohlen, das Literal explizit in den gewünschten Datumstyp mithilfe eines deterministischen Datumsformatformats zu konvertieren. Eine Liste der deterministischen Datenformatstile finden Sie unter CAST und CONVERT.
Weitere Informationen finden Sie unter Nicht deterministische Konvertierung von Datumsliteralzeichenfolgen in DATE-Werte.
Kompatibilitätsgrad
Die implizite Konvertierung von Nicht-Unicode-Zeichendaten zwischen Sortierungen gilt als nicht deterministisch, es sei denn, die Kompatibilitätsstufe ist auf 80
oder früher festgelegt.
Wenn die Einstellung für die Datenbankkompatibilitätsebene festgelegt ist 90
, können Sie keine Indizes für berechnete Spalten erstellen, die diese Ausdrücke enthalten. Vorhandene berechnete Spalten, die diese Ausdrücke aus einer aktualisierten Datenbank enthalten, sind jedoch verwaltbar. Wenn Sie indizierte berechnete Spalten verwenden, die implizite Zeichenfolgen in Datumskonvertierungen enthalten, um mögliche Indexbeschädigungen zu vermeiden, stellen Sie sicher, dass die LANGUAGE
Einstellungen DATEFORMAT
in Ihren Datenbanken und Anwendungen konsistent sind.
Kompatibilitätsebene 90
entspricht SQL Server 2005 (9.x).
Anforderungen hinsichtlich der Präzision
Der computed_column_expression muss präzise sein. Ein computed_column_expression ist präzise, wenn mindestens eine der folgenden Bedingungen zutrifft:
Es handelt sich nicht um einen Ausdruck der Float - oder realen Datentypen.
Es verwendet keinen float - oder realen Datentyp in seiner Definition. Beispielsweise ist in der folgenden Anweisung die
y
-Spalte eine int und deterministisch, aber nicht präzise.CREATE TABLE t2 (a int, b int, c int, x float, y AS CASE x WHEN 0 THEN a WHEN 1 THEN b ELSE c END);
Hinweis
Jeder float - oder real -Ausdruck gilt als nicht präzise und kann nicht als Schlüssel eines Indexes verwendet werden; ein float - oder real -Ausdruck kann in einer indizierten Sicht, jedoch nicht als Schlüssel verwendet werden. Dies gilt auch für berechnete Spalten. Jede Funktion, jeder Ausdruck oder jede benutzerdefinierte Funktion gilt als unpräzise, wenn sie irgendeinen float - oder real Ausdruck enthält. Das gilt auch für logische (Vergleiche).
Die IsPrecise
Eigenschaft der COLUMNPROPERTY
Funktion meldet, ob ein computed_column_expression genau ist.
Anforderungen hinsichtlich des Datentyps
- Die für die berechnete Spalte definierte computed_column_expression kann nicht in den Datentypen "Text", "ntext" oder "Bild " ausgewertet werden.
- Berechnete Spalten, die aus den Datentypen image, ntext, text, varchar(max), nvarchar(max), varbinary(max)und xml abgeleitet wurden, können indiziert werden, solange der Datentyp der berechneten Spalte als Indexschlüsselspalte zulässig ist.
- Berechnete Spalten, die aus den Datentypen image, ntextund text abgeleitet wurden, können Nichtschlüsselspalten (eingeschlossene Spalten) in einem nicht gruppierten Index sein, so lange der Datentyp der berechneten Spalte für Nichtschlüssel-Indexspalten zulässig ist.
Anforderungen hinsichtlich der SET-Option
Die
ANSI_NULLS
Option auf Verbindungsebene muss festgelegtON
werden, wenn die berechnete Spalte oder AnweisungCREATE TABLE
ALTER TABLE
ausgeführt wird. Die OBJECTPROPERTY-Funktion meldet, ob die Option über dieIsAnsiNullsOn
Eigenschaft aktiviert ist.Die Verbindung, für die der Index erstellt wird, und alle Verbindungen, die versuchen
INSERT
, oderUPDATE
DELETE
Anweisungen, die Werte im Index ändern, müssen sechsSET
Optionen festgelegtON
sein und eine Option aufOFF
. Der Optimierer ignoriert einen Index für eine berechnete Spalte für jedeSELECT
Anweisung, die von einer Verbindung ausgeführt wird, die nicht über dieselben Optionseinstellungen verfügt.Die
NUMERIC_ROUNDABORT
Option muss auf " festgelegtOFF
sein, und die folgenden Optionen müssen auf :ON
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
Hinweis
Einstellung ANSI_WARNINGS
auf ON
implizit festgelegt ARITHABORT
ON
, wenn die Datenbankkompatibilitätsebene auf 90
oder höher festgelegt ist.
Erstellen von Indizes für gespeicherte berechnete Spalten
Manchmal können Sie eine berechnete Spalte erstellen, die mit einem deterministischen, aber unpräzisen Ausdruck definiert ist. Sie können dies tun, wenn die Spalte in der CREATE TABLE
Oder-Anweisung ALTER TABLE
markiert PERSISTED
ist.
Das bedeutet, dass Datenbank-Engine die berechneten Werte in der Tabelle speichert und sie aktualisiert, wenn andere Spalten, von denen die berechnete Spalte abhängt, aktualisiert werden. Datenbank-Engine verwendet diese persistenten Werte, wenn ein Index für die Spalte erstellt wird und wenn in einer Abfrage auf den Index verwiesen wird.
Mit dieser Option können Sie einen Index für eine berechnete Spalte erstellen, wenn das Datenbankmodul nicht mit Genauigkeit nachweisen kann, ob eine Funktion, die berechnete Spaltenausdrücke zurückgibt, insbesondere eine CLR-Funktion, die in .NET Framework erstellt wird, sowohl deterministisch als auch präzise ist.
Hinweis
Sie können keinen gefilterten Index für eine berechnete Spalte erstellen.
Nächste Schritte
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für