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. oder AVG 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 festgelegt ON werden, wenn die berechnete Spalte oder Anweisung CREATE TABLEALTER TABLE ausgeführt wird. Die OBJECTPROPERTY-Funktion meldet, ob die Option über die IsAnsiNullsOn Eigenschaft aktiviert ist.

  • Die Verbindung, für die der Index erstellt wird, und alle Verbindungen, die versuchenINSERT, oder UPDATEDELETE Anweisungen, die Werte im Index ändern, müssen sechs SET Optionen festgelegt ON sein und eine Option auf OFF. Der Optimierer ignoriert einen Index für eine berechnete Spalte für jede SELECT Anweisung, die von einer Verbindung ausgeführt wird, die nicht über dieselben Optionseinstellungen verfügt.

    Die NUMERIC_ROUNDABORT Option muss auf " festgelegt OFFsein, 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 ARITHABORTON , 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