Indici per le colonne calcolate
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure
È possibile definire gli indici per le colonne calcolate purché siano soddisfatti i requisiti seguenti:
- Requisiti di proprietà
- Requisiti di determinismo
- Requisiti di precisione
- Requisiti del tipo di dati
- Requisiti dell'opzione SET
Nota
È necessario che l'opzione SET QUOTED_IDENTIFIER
sia impostata su ON
durante la creazione o la modifica di indici in colonne calcolate o viste indicizzate. Per altre informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).
Requisiti di proprietà
Tutti i riferimenti a funzioni nella colonna calcolata devono avere lo stesso proprietario della tabella.
Requisiti di determinismo
Le espressioni sono deterministiche se restituiscono sempre lo stesso risultato per un determinato set di input. La proprietà IsDeterministic
della funzione COLUMNPROPERTY indica se una computed_column_expression è deterministica.
La computed_column_expression deve essere deterministica. Una computed_column_expression è deterministica quando sono soddisfatte tutte le condizioni seguenti:
Tutte le funzioni alle quali l'espressione fa riferimento sono deterministiche e precise. Queste funzioni includono funzioni definite dall'utente e funzioni predefinite. Per altre informazioni, vedere Funzioni deterministiche e non deterministiche. Le funzioni potrebbero non essere precise se la colonna calcolata è
PERSISTED
. Per altre informazioni, vedere Creare indici per colonne calcolate persistenti più avanti in questo articolo.Tutte le colonne alle quali viene fatto riferimento nell'espressione appartengono alla tabella contenente la colonna calcolata.
Nessun riferimento a una colonna estrae dati da più righe. Ad esempio, funzioni di aggregazione quali
SUM
oAVG
dipendono dai dati presenti in più righe e renderebbero non deterministica una computed_column_expression.L'espressione computed_column_expression è priva di accesso ai dati di sistema o ai dati utente.
Qualsiasi colonna calcolata contenente un'espressione CLR (Common Language Runtime) deve essere deterministica e contrassegnata come PERSISTED
prima di poter essere indicizzata. Le espressioni di tipo CLR definito dall'utente sono consentite nelle definizioni delle colonne calcolate. Le colonne calcolate di tipo CLR definito dall'utente possono essere indicizzate purché il tipo sia confrontabile. Per altre informazioni, vedere Tipi CLR definiti dall'utente.
CAST e CONVERT
Quando si fa riferimento ai valori letterali stringa del tipo di dati relativo alla data in SQL 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. Per un elenco degli stili del formato di data deterministici, vedere CAST e CONVERT.
Per altre informazioni, vedere Conversione non deterministica di stringhe di valori letterali in valori DATE.
Livello di compatibilità
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
.
Se l'impostazione del livello di compatibilità del database è 90
, non è possibile creare indici su colonne calcolate contenenti tali espressioni. Tuttavia, le colonne calcolate esistenti che includono queste espressioni da un database aggiornato sono gestibili. 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.
Il livello di compatibilità 90
corrisponde a SQL Server 2005 (9.x).
Requisiti di precisione
La computed_column_expression deve essere precisa. Una computed_column_expression è precisa quando viene soddisfatta una o più delle condizioni seguenti:
Non è un'espressione dei tipi di dati float o real.
Nella definizione dell'espressione non viene usato il tipo di dati float o real. Ad esempio, nell'istruzione seguente la colonna
y
è di tipo int ed è deterministica, ma non precisa.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. Questa considerazione è valida anche per le colonne calcolate. Funzioni, espressioni oppure funzioni definite dall'utente sono considerate non precise se includono espressioni float o real . Sono comprese le espressioni logiche (confronti).
La proprietà IsPrecise
della funzione COLUMNPROPERTY
indica se una computed_column_expression è precisa.
Requisiti del tipo di dati
- L'espressione computed_column_expression definita per la colonna calcolata non può restituire i tipi di dati text, ntext o image.
- 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.
- 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.
Requisiti dell'opzione SET
Quando viene eseguita l'istruzione
CREATE TABLE
oALTER TABLE
che definisce la colonna calcolata, è necessario impostare l'opzione a livello di connessioneANSI_NULLS
suON
. La funzione OBJECTPROPERTY indica se l'opzione è impostata su ON nella proprietàIsAnsiNullsOn
.Per la connessione in corrispondenza della quale viene creato l'indice e per tutte le connessioni che tentano di eseguire istruzioni
INSERT
,UPDATE
oDELETE
che modificano i valori dell'indice, sei opzioniSET
devono essere impostate suON
e un'opzione deve essere impostata suOFF
. Per tutte le eventuali istruzioniSELECT
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.L'opzione
NUMERIC_ROUNDABORT
deve essere impostata suOFF
e le opzioni seguenti suON
.ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
Nota
L'impostazione di ANSI_WARNINGS
su ON
comporta anche l'impostazione implicita di ARITHABORT
su ON
quando il livello di compatibilità del database è impostato su 90
o su un valore maggiore.
Creare indici per colonne calcolate persistenti
In alcuni casi è possibile creare una colonna calcolata definita con un'espressione che pur essendo deterministica risulta imprecisa. Questa operazione può essere eseguita quando la colonna è contrassegnata PERSISTED
nell'istruzione CREATE TABLE
o ALTER TABLE
.
Questo significa che il motore di database archivia i valori calcolati nella tabella e li aggiorna quando vengono aggiornate altre colonne da cui dipende la colonna calcolata. Il motore di database usa questi valori persistenti quando crea un indice sulla colonna e quando viene fatto riferimento all'indice all'interno di una query.
Questa opzione consente di creare un indice in una colonna calcolata quando il motore di database non è in grado di verificare esattamente se una funzione che restituisce espressioni di colonne calcolate, in particolare una funzione CLR creata in .NET Framework, sia deterministica e precisa.
Nota
Non è possibile creare un indice filtrato su una colonna calcolata.
Passaggi successivi
- COLUMNPROPERTY (Transact-SQL)
- CREATE TABLE (Transact-SQL)
- ALTER TABLE (Transact-SQL)