Indizes in berechneten SpaltenIndexes on Computed Columns

DIESES THEMA GILT FÜR:jaSQL Server (ab 2016)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Sie können Indizes für berechnete Spalten definieren, sofern die folgenden Anforderungen erfüllt sind:You can define indexes on computed columns as long as the following requirements are met:

  • Anforderungen hinsichtlich des BesitzesOwnership requirements

  • Anforderungen hinsichtlich des DeterminismusDeterminism requirements

  • Anforderungen hinsichtlich der PräzisionPrecision requirements

  • Anforderungen hinsichtlich des DatentypsData type requirements

  • Anforderungen hinsichtlich der SET-OptionSET option requirements

    Ownership RequirementsOwnership Requirements

    Alle Funktionsverweise in der berechneten Spalte müssen denselben Besitzer wie die Tabelle aufweisen.All function references in the computed column must have the same owner as the table.

    Determinism RequirementsDeterminism Requirements

Wichtig

Ausdrücke gelten als deterministisch, wenn sie für eine bestimmte Gruppen von Eingaben stets dasselbe Ergebnis zurückgeben.Expressions are deterministic if they always return the same result for a specified set of inputs. Die IsDeterministic -Eigenschaft der COLUMNPROPERTY -Funktion teilt mit, ob der Ausdruck einer berechneten Spalte ( computed_column_expression ) deterministisch ist.The IsDeterministic property of the COLUMNPROPERTY function reports whether a computed_column_expression is deterministic.

Der computed_column_expression muss deterministisch sein.The computed_column_expression must be deterministic. Ein computed_column_expression ist deterministisch, wenn mindestens eine der folgenden Bedingungen zutrifft:A computed_column_expression is deterministic when one or more of the following is true:

  • Alle Funktionen, auf die der Ausdruck verweist, sind deterministisch und präzise.All functions that are referenced by the expression are deterministic and precise. Zu diesen Funktionen zählen benutzerdefinierte und integrierte Funktionen.These functions include both user-defined and built-in functions. Weitere Informationen finden Sie unter Deterministic and Nondeterministic Functions.For more information, see Deterministic and Nondeterministic Functions. Funktionen können unpräzise sein, wenn die berechnete Spalte als PERSISTED markiert ist.Functions might be imprecise if the computed column is PERSISTED. Weitere Informationen finden Sie unter Erstellen von Indizes für persistente berechnete Spalten nachfolgend in diesem Thema.For more information, see Creating Indexes on Persisted Computed Columns later in this topic.

  • Alle Spalten, auf die der Ausdruck verweist, stammen aus der Tabelle, die die berechnete Spalte enthält.All columns that are referenced in the expression come from the table that contains the computed column.

  • Kein Spaltenverweis ruft Daten aus mehreren Zeilen ab.No column reference pulls data from multiple rows. Beispielsweise hängen Aggregatfunktionen wie SUM oder AVG von Daten aus mehreren Zeilen ab, und ein computed_column_expression wäre dadurch nicht deterministisch.For example, aggregate functions such as SUM or AVG depend on data from multiple rows and would make a computed_column_expression nondeterministic.

  • Der computed_column_expression kann weder auf Systemdaten noch auf Benutzerdaten zugreifen.The computed_column_expression has no system data access or user data access.

    Jede berechnete Spalte, die einen CLR-Ausdruck (Common Language Runtime) enthält, muss deterministisch und als PERSISTED markiert sein, bevor die Spalte indiziert werden kann.Any computed column that contains a common language runtime (CLR) expression must be deterministic and marked PERSISTED before the column can be indexed. Ausdrücke des CLR-benutzerdefinierten Typs sind in den Definitionen berechneter Spalten zulässig.CLR user-defined type expressions are allowed in computed column definitions. Berechnete Spalten, deren Typ ein CLR-benutzerdefinierter Typ ist, können indiziert werden, sofern der Typ vergleichbar ist.Computed columns whose type is a CLR user-defined type can be indexed as long as the type is comparable. Weitere Informationen finden Sie unter Benutzerdefinierte CLR-Typen.For more information, see CLR User-Defined Types.

Hinweis

Wenn Sie in SQL ServerSQL Serverauf Zeichenfolgenliterale des Date-Datentyps in indizierten berechneten Spalten verweisen, ist es ratsam, das Literal explizit in den gewünschten Datentyp zu konvertieren, indem Sie ein deterministisches Datenformat verwenden.When you refer to string literals of the date data type in indexed computed columns in SQL ServerSQL Server, we recommend that you explicitly convert the literal to the date type that you want by using a deterministic date format style. Eine Liste der deterministischen Datenformatstile finden Sie unter CAST und CONVERT.For a list of the date format styles that are deterministic, see CAST and CONVERT. Ausdrücke für die implizierte Konvertierung von Zeichenfolgen in date-Datentypen werden als nicht deterministisch bezeichnet, es sei denn, der Kompatibilitätsgrad der Datenbank ist auf 80 oder niedriger festgelegt.Expressions that involve implicit conversion of character strings to date data types are considered nondeterministic, unless the database compatibility level is set to 80 or earlier. Ursache hierfür ist, dass die Ergebnisse von den LANGUAGE - und DATEFORMAT -Einstellungen der Serversitzung abhängig sind.This is because the results depend on the LANGUAGE and DATEFORMAT settings of the server session. Die Ergebnisse des Ausdrucks CONVERT (datetime, '30 listopad 1996', 113) hängen beispielsweise von der LANGUAGE-Einstellung ab, da die Zeichenfolge '30 listopad 1996' für verschiedene Monate in verschiedenen Sprachen steht.For example, the results of the expression CONVERT (datetime, '30 listopad 1996', 113) depend on the LANGUAGE setting because the string '30 listopad 1996' means different months in different languages. In ähnlicher Weise interpretiert DATEADD(mm,3,'2000-12-01')in dem Ausdruck DatenbankmodulDatabase Engine die Zeichenfolge '2000-12-01' basierend auf der DATEFORMAT-Einstellung.Similarly, in the expression DATEADD(mm,3,'2000-12-01'), the DatenbankmodulDatabase Engine interprets the string '2000-12-01' based on the DATEFORMAT setting.

Die implizierte Konvertierung von Nicht-Unicode-Zeichendaten zwischen Sortierungen wird auch als nicht deterministisch erachtet, wenn der Kompatibilitätsgrad nicht auf 80 oder niedriger festgelegt ist.Implicit conversion of non-Unicode character data between collations is also considered nondeterministic, unless the compatibility level is set to 80 or earlier.

Beträgt die Einstellung des Kompatibilitätsgrades der Datenbank 90, können Sie keine Indizes für berechnete Spalten erstellen, die diese Ausdrücke enthalten.When the database compatibility level setting is 90, you cannot create indexes on computed columns that contain these expressions. Vorhandene berechnete Spalten, die diese Ausdrücke aus einer aktualisierten Datenbank enthalten, sind jedoch verwaltbar.However, existing computed columns that contain these expressions from an upgraded database are maintainable. Bei Verwendung indizierter berechneter Spalten, die implizite Konvertierungen von Zeichenfolgen in Datumsangaben enthalten, sollten Sie sicherstellen, dass die LANGUAGE- und DATEFORMAT-Einstellungen in der Datenbank und den Anwendungen konsistent sind, um mögliche Beschädigungen der Indizes zu vermeiden.If you use indexed computed columns that contain implicit string to date conversions, to avoid possible index corruption, make sure that the LANGUAGE and DATEFORMAT settings are consistent in your databases and applications.

Precision RequirementsPrecision Requirements

Der computed_column_expression muss präzise sein.The computed_column_expression must be precise. Ein computed_column_expression ist präzise, wenn mindestens eine der folgenden Bedingungen zutrifft:A computed_column_expression is precise when one or more of the following is true:

  • Es handelt sich um keinen Ausdruck des float - oder real -Datentyps.It is not an expression of the float or real data types.

  • In der Definition des Ausdrucks wird kein float - oder real -Datentyp verwendet.It does not use a float or real data type in its definition. Beispielsweise ist in der folgenden Anweisung die y -Spalte eine int und deterministisch, aber nicht präzise.For example, in the following statement, column y is int and deterministic but not precise.

    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.Any float or real expression is considered imprecise and cannot be a key of an index; a float or real expression can be used in an indexed view but not as a key. Dies gilt auch für berechnete Spalten.This is true also for computed columns. Jede Funktion, jeder Ausdruck oder jede benutzerdefinierte Funktion gilt als unpräzise, wenn sie irgendeinen float - oder real Ausdruck enthält.Any function, expression, or user-defined function is considered imprecise if it contains any float or real expressions. Das gilt auch für logische (Vergleiche).This includes logical ones (comparisons).

Die IsPrecise -Eigenschaft der COLUMNPROPERTY-Funktion teilt mit, ob der Ausdruck einer berechneten Spalte ( computed_column_expression ) präzise ist.The IsPrecise property of the COLUMNPROPERTY function reports whether a computed_column_expression is precise.

Data Type RequirementsData Type Requirements

  • Der computed_column_expression , der für die berechnete Spalte definiert ist, kann nicht zu einem der Datentypen text, ntextoder image ausgewertet werden.The computed_column_expression defined for the computed column cannot evaluate to the text, ntext, or image data types.

  • 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.Computed columns derived from image, ntext, text, varchar(max), nvarchar(max), varbinary(max), and xml data types can be indexed as long as the computed column data type is allowable as an index key column.

  • 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.Computed columns derived from image, ntext, and text data types can be nonkey (included) columns in a nonclustered index as long as the computed column data type is allowable as a nonkey index column.

    SET Option RequirementsSET Option Requirements

  • Die ANSI_NULLS-Option auf Verbindungsebene muss auf ON festgelegt sein, wenn die CREATE TABLE- oder ALTER TABLE-Anweisung, die die berechnete Spalte definiert, ausgeführt wird.The ANSI_NULLS connection-level option must be set to ON when the CREATE TABLE or ALTER TABLE statement that defines the computed column is executed. Die OBJECTPROPERTY -Funktion meldet mithilfe der IsAnsiNullsOn -Eigenschaft, ob die Option auf ON festgelegt ist.The OBJECTPROPERTY function reports whether the option is on through the IsAnsiNullsOn property.

  • Für die Verbindung, für die der Index erstellt wird, und für alle Verbindungen, die versuchen, INSERT-, UPDATE- oder DELETE-Anweisungen auszuführen, die Werte des Indexes ändern, müssen sechs SET-Optionen auf ON und eine SET-Option auf OFF festgelegt sein.The connection on which the index is created, and all connections trying INSERT, UPDATE, or DELETE statements that will change values in the index, must have six SET options set to ON and one option set to OFF. Der Optimierer ignoriert einen Index für eine berechnete Spalte für alle SELECT-Anweisungen, die von einer Verbindung ausgeführt werden, die diese Optionseinstellungen nicht aufweist.The optimizer ignores an index on a computed column for any SELECT statement executed by a connection that does not have these same option settings.

    • Die NUMERIC_ROUNDABORT-Option muss auf OFF festgelegt sein, und die folgenden Optionen müssen auf ON festgelegt sein:The NUMERIC_ROUNDABORT option must be set to OFF, and the following options must be set to ON:

    • ANSI_NULLSANSI_NULLS

    • ANSI_PADDINGANSI_PADDING

    • ANSI_WARNINGSANSI_WARNINGS

    • ARITHABORTARITHABORT

    • CONCAT_NULL_YIELDS_NULLCONCAT_NULL_YIELDS_NULL

    • QUOTED_IDENTIFIERQUOTED_IDENTIFIER

      Durch Festlegen von ANSI_WARNINGS auf ON wird implizit ARITHABORT auf ON festgelegt, wenn der Kompatibilitätsgrad der Datenbank auf 90 oder höher festgelegt ist.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher.

Erstellen von Indizes für persistente berechnete Spalten Creating Indexes on Persisted Computed Columns

Sie können einen Index für eine berechnete Spalte erstellen, die mit einem deterministischen, jedoch unpräzisen Ausdruck definiert wird, wenn die Spalte in der CREATE TABLE- oder ALTER TABLE-Anweisung als PERSISTED markiert wurde.You can create an index on a computed column that is defined with a deterministic, but imprecise, expression if the column is marked PERSISTED in the CREATE TABLE or ALTER TABLE statement. Das bedeutet, dass DatenbankmodulDatabase Engine die berechneten Werte in der Tabelle speichert und sie aktualisiert, wenn andere Spalten, von denen die berechnete Spalte abhängt, aktualisiert werden.This means that the DatenbankmodulDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. DatenbankmodulDatabase Engine verwendet diese persistenten Werte, wenn ein Index für die Spalte erstellt wird und wenn in einer Abfrage auf den Index verwiesen wird.The DatenbankmodulDatabase Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query. Diese Option ermöglicht Ihnen das Erstellen eines Indexes für eine berechnete Spalte, wenn DatenbankmodulDatabase Engine nicht präzise nachweisen kann, ob eine Funktion, die berechnete Spaltenausdrücke zurückgibt, insbesondere eine CLR-Funktion, die in .NET Framework.NET Frameworkerstellt wurde, sowohl deterministisch als auch präzise ist.This option enables you to create an index on a computed column when DatenbankmodulDatabase Engine cannot prove with accuracy whether a function that returns computed column expressions, particularly a CLR function that is created in the .NET Framework.NET Framework, is both deterministic and precise.

COLUMNPROPERTY (Transact-SQL)COLUMNPROPERTY (Transact-SQL)