Indici per le colonne calcolateIndexes on Computed Columns

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

È possibile definire gli indici per le colonne calcolate purché siano soddisfatti i requisiti seguenti:You can define indexes on computed columns as long as the following requirements are met:

  • Requisiti di proprietàOwnership requirements

  • Requisiti di determinismoDeterminism requirements

  • Requisiti di precisionePrecision requirements

  • Requisiti del tipo di datiData type requirements

  • Requisiti dell'opzione SETSET option requirements

    Ownership RequirementsOwnership Requirements

    Tutti i riferimenti a funzioni nella colonna calcolata devono avere lo stesso proprietario della tabella.All function references in the computed column must have the same owner as the table.

    Determinism RequirementsDeterminism Requirements

Importante

Le espressioni sono deterministiche se restituiscono sempre lo stesso risultato per un determinato set di input.Expressions are deterministic if they always return the same result for a specified set of inputs. La proprietà IsDeterministic della funzione COLUMNPROPERTY indica se una computed_column_expression è deterministica.The IsDeterministic property of the COLUMNPROPERTY function reports whether a computed_column_expression is deterministic.

La computed_column_expression deve essere deterministica.The computed_column_expression must be deterministic. Una computed_column_expression è deterministica quando viene soddisfatta una o più delle condizioni seguenti:A computed_column_expression is deterministic when one or more of the following is true:

  • Tutte le funzioni alle quali l'espressione fa riferimento sono deterministiche e precise.All functions that are referenced by the expression are deterministic and precise. Queste funzioni includono funzioni definite dall'utente e funzioni predefinite.These functions include both user-defined and built-in functions. Per altre informazioni, vedere Funzioni deterministiche e non deterministiche.For more information, see Deterministic and Nondeterministic Functions. Le funzioni potrebbero non essere precise se la colonna calcolata è PERSISTED.Functions might be imprecise if the computed column is PERSISTED. Per altre informazioni, vedere Creazione di indici per colonne calcolate persistenti più avanti in questo argomento.For more information, see Creating Indexes on Persisted Computed Columns later in this topic.

  • Tutte le colonne alle quali viene fatto riferimento nell'espressione appartengono alla tabella contenente la colonna calcolata.All columns that are referenced in the expression come from the table that contains the computed column.

  • Nessun riferimento a una colonna estrae dati da più righe.No column reference pulls data from multiple rows. Ad esempio, funzioni di aggregazione quali SUM o AVG dipendono dai dati presenti in più righe e renderebbero non deterministica una computed_column_expression .For example, aggregate functions such as SUM or AVG depend on data from multiple rows and would make a computed_column_expression nondeterministic.

  • L'espressione computed_column_expression è priva di accesso ai dati di sistema o ai dati utente.The computed_column_expression has no system data access or user data access.

    Qualsiasi colonna calcolata contenente un'espressione CLR (Common Language Runtime) deve essere deterministica e contrassegnata come PERSISTED prima di poter essere indicizzata.Any computed column that contains a common language runtime (CLR) expression must be deterministic and marked PERSISTED before the column can be indexed. Le espressioni di tipo CLR definito dall'utente sono consentite nelle definizioni delle colonne calcolate.CLR user-defined type expressions are allowed in computed column definitions. Le colonne calcolate di tipo CLR definito dall'utente possono essere indicizzate purché il tipo sia confrontabile.Computed columns whose type is a CLR user-defined type can be indexed as long as the type is comparable. Per altre informazioni, vedere Tipi CLR definiti dall'utente.For more information, see CLR User-Defined Types.

Nota

Quando si fa riferimento ai valori letterali stringa del tipo di dati relativo alla data in SQL ServerSQL Server, si consiglia di convertire in modo esplicito il valore letterale nel tipo di data che si desidera utilizzando uno stile di formato di data deterministico.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. Per un elenco degli stili del formato di data deterministici, vedere CAST e CONVERT.For a list of the date format styles that are deterministic, see CAST and CONVERT. Le espressioni che prevedono la conversione implicita delle stringhe di carattere nei tipi di dati relativi alla data vengono considerate non deterministiche, a meno che il livello di compatibilità del database non venga impostato su 80 o su un valore inferiore.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. Ciò è dovuto al fatto che i risultati dipendono dalle impostazioni LANGUAGE e DATEFORMAT della sessione del server.This is because the results depend on the LANGUAGE and DATEFORMAT settings of the server session. I risultati dell'espressione CONVERT (datetime, '30 listopad 1996', 113) dipendono ad esempio dall'impostazione LANGUAGE, in quanto la stringa '30 listopad 1996' indica mesi diversi in diverse lingue.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. Analogamente, nell'espressione DATEADD(mm,3,'2000-12-01'), Motore di databaseDatabase Engine interpreta la stringa '2000-12-01' in base all'impostazione DATEFORMAT.Similarly, in the expression DATEADD(mm,3,'2000-12-01'), the Motore di databaseDatabase Engine interprets the string '2000-12-01' based on the DATEFORMAT setting.

Anche la conversione implicita dei dati di tipo carattere non Unicode tra regole di confronto viene considerata non deterministica, a meno che il livello di compatibilità non sia impostato su un valore minore o uguale a 80.Implicit conversion of non-Unicode character data between collations is also considered nondeterministic, unless the compatibility level is set to 80 or earlier.

Se l'impostazione del livello di compatibilità del database è 90, non è possibile creare indici su colonne calcolate contenenti tali espressioni.When the database compatibility level setting is 90, you cannot create indexes on computed columns that contain these expressions. Tuttavia, le colonne calcolate esistenti che includono queste espressioni da un database aggiornato sono gestibili.However, existing computed columns that contain these expressions from an upgraded database are maintainable. Se si utilizzano colonne calcolate che includono conversioni implicite da valori di tipo stringa a valori di tipo data, verificare che le impostazioni LANGUAGE e DATEFORMAT siano consistenti nei database e nelle applicazioni per evitare l'eventuale danneggiamento dell'indice.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

La computed_column_expression deve essere precisa.The computed_column_expression must be precise. Una computed_column_expression è precisa quando viene soddisfatta una o più delle condizioni seguenti:A computed_column_expression is precise when one or more of the following is true:

  • Non è un'espressione dei tipi di dati float o real .It is not an expression of the float or real data types.

  • Nella definizione dell'espressione non viene usato il tipo di dati float o real .It does not use a float or real data type in its definition. Ad esempio, nell'istruzione seguente la colonna y è di tipo int ed è deterministica, ma non precisa.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);  
    

Nota

Le espressioni di tipo float o real sono considerate non precise e non possono essere usate come chiavi di un indice. Un'espressione float o real può essere usata in una vista indicizzata, ma non come chiave.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. Questa considerazione è valida anche per le colonne calcolate.This is true also for computed columns. Funzioni, espressioni oppure funzioni definite dall'utente sono considerate non precise se includono espressioni float o real .Any function, expression, or user-defined function is considered imprecise if it contains any float or real expressions. Sono comprese le espressioni logiche (confronti).This includes logical ones (comparisons).

La proprietà IsPrecise della funzione COLUMNPROPERTY indica se una computed_column_expression è precisa.The IsPrecise property of the COLUMNPROPERTY function reports whether a computed_column_expression is precise.

Data Type RequirementsData Type Requirements

  • L'espressione computed_column_expression definita per la colonna calcolata non può restituire i tipi di dati text, ntexto image .The computed_column_expression defined for the computed column cannot evaluate to the text, ntext, or image data types.

  • Le colonne calcolate derivate dai tipi di dati image, ntext, text, varchar(max), nvarchar(max), varbinary(max)e xml possono essere indicizzate purché il tipo di dati della colonna calcolata sia consentito come colonna chiave dell'indice.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.

  • Le colonne calcolate derivate dai tipi di dati image, ntexte text possono essere colonne non chiave (incluse) in un indice non cluster purché il tipo di dati della colonna calcolata sia consentito come colonna non chiave dell'indice.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

  • Quando viene eseguita l'istruzione CREATE TABLE o ALTER TABLE che definisce la colonna calcolata, è necessario impostare su ON l'opzione a livello di connessione ANSI_NULL.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. La funzione OBJECTPROPERTY indica se l'opzione è impostata su ON nella proprietà IsAnsiNullsOn .The OBJECTPROPERTY function reports whether the option is on through the IsAnsiNullsOn property.

  • Per la connessione in corrispondenza della quale viene creato l'indice e per tutte le connessioni che tentano di eseguire istruzioni INSERT, UPDATE o DELETE che modificano i valori dell'indice, sei opzioni SET devono essere impostate su ON e un'opzione SET deve essere impostata su OFF.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. Per tutte le eventuali istruzioni SELECT eseguite da una connessione per la quale non sono state definite esattamente le impostazioni delle opzioni indicate di seguito, Query Optimizer ignora gli indici definiti su una colonna calcolata.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.

    • L'opzione NUMERIC_ROUNDABORT deve essere impostata su OFF e le opzioni seguenti su ON.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

      Quando il livello di compatibilità del database è impostato su 90 o su un valore maggiore, l'impostazione di ANSI_WARNINGS su ON comporta anche l'impostazione implicita di ARITHABORT su ON.Setting ANSI_WARNINGS to ON implicitly sets ARITHABORT to ON when the database compatibility level is set to 90 or higher.

Creazione di indici per colonne calcolate persistenti Creating Indexes on Persisted Computed Columns

È possibile creare un indice su una colonna calcolata. definita da un'espressione deterministica, ma non precisa, se la colonna è contrassegnata come PERSISTED nell'istruzione CREATE TABLE oppure ALTER TABLE.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. Questo significa che Motore di databaseDatabase Engine archivia i valori calcolati nella tabella e li aggiorna quando vengono aggiornate altre colonne da cui dipende la colonna calcolata.This means that the Motore di databaseDatabase Engine stores the computed values in the table, and updates them when any other columns on which the computed column depends are updated. Motore di databaseDatabase Engine utilizza questi valori persistenti quando crea un indice sulla colonna e quando viene fatto riferimento all'indice all'interno di una query.The Motore di databaseDatabase Engine uses these persisted values when it creates an index on the column, and when the index is referenced in a query. Questa opzione consente di creare un indice in una colonna calcolata quando Motore di databaseDatabase Engine non è in grado di verificare esattamente se una funzione che restituisce espressioni di colonne calcolate, in particolare una funzione CLR creata in .NET Framework.NET Framework, sia deterministica e precisa.This option enables you to create an index on a computed column when Motore di databaseDatabase 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)