Sì se:
- stanno eseguendo SQL Server 2014 o versioni successive; e
- sono in grado di eseguire la query con il flag di traccia 176 attivo; e
- la colonna calcolata è
PERSISTED
In particolare, sono richieste almeno le seguenti versioni :
- Aggiornamento cumulativo 2 per SQL Server 2016 SP1
- Aggiornamento cumulativo 4 per SQL Server 2016 RTM
- Aggiornamento cumulativo 6 per SQL Server 2014 SP2
MA per evitare un bug (riferimento per il 2014 e per il 2016 e il 2017 ) introdotto in tali correzioni, applicare invece:
Il flag di traccia è efficace come –T
opzione di avvio , sia a livello globale che di sessione utilizzando DBCC TRACEON
, e per query con OPTION (QUERYTRACEON)
o una guida di piano.
Il flag di traccia 176 impedisce l'espansione della colonna calcolata persistente.
Il caricamento iniziale dei metadati eseguito durante la compilazione di una query porta in tutte le colonne, non solo quelle a cui viene fatto direttamente riferimento. Questo rende tutte le definizioni di colonne calcolate disponibili per la corrispondenza, il che è generalmente una buona cosa.
Come sfortunato effetto collaterale, se una delle colonne caricate (calcolate) utilizza una funzione scalare definita dall'utente, la sua presenza disabilita il parallelismo per l'intera query, anche quando la colonna calcolata non viene effettivamente utilizzata .
Il flag di traccia 176 aiuta in questo, se la colonna è persistente, non caricando la definizione (poiché l'espansione viene ignorata). In questo modo, una funzione scalare definita dall'utente non è mai presente nell'albero delle query di compilazione, quindi il parallelismo non è disabilitato.
Lo svantaggio principale del flag di traccia 176 (oltre ad essere solo leggermente documentato) è che impedisce anche la corrispondenza dell'espressione di query con colonne calcolate persistenti: se la query contiene un'espressione corrispondente a una colonna calcolata persistente, il flag di traccia 176 impedirà che l'espressione venga sostituita da un riferimento alla colonna calcolata.
Per ulteriori dettagli, consultare il mio articolo su SQLPerformance.com, colonne calcolate correttamente persistenti .
Dato che la domanda menziona XML, in alternativa alla promozione di valori usando una colonna calcolata e una funzione scalare, potresti anche usare un indice XML selettivo, come hai scritto in Indici XML selettivi: niente male .