Mentre leggevo il mio libro degli esami 70-433, ho pensato a qualcosa che posso vedere non funzionare, ma credo che lo faccia. Il passaggio legge qualcosa del tipo:
La colonna deve inoltre essere contrassegnata come PERSISTED , il che significa che SQL Server memorizza fisicamente il risultato dell'espressione della colonna calcolata nella riga di dati anziché calcolarlo ogni volta che viene indicato in una query.
Da questo capisco due cose:
- Una colonna calcolata non persistente viene calcolata ogni volta che viene referenziata in una query
- Poiché non viene memorizzato nulla per la colonna calcolata, suppongo che non sia possibile creare un indice per la colonna.
Dopo averlo letto, ho pensato che fosse un po 'strano dato che sono riuscito a creare un indice su una colonna non persistente in un progetto precedente.
Come si può creare un indice per qualcosa che non è persistente ed è dannoso a lungo termine?
Per dimostrarlo, ho eseguito la seguente istruzione SQL:
CREATE TABLE testTable
(
ID INT IDENTITY(1,1) PRIMARY KEY,
telephone VARCHAR(14),
c_areaCode AS (SUBSTRING(telephone,0,5)),
cp_areaCode AS (SUBSTRING(telephone,0,5)) PERSISTED
)
INSERT INTO testTable VALUES('09823 000000');
INSERT INTO testTable VALUES('09824 000000');
INSERT INTO testTable VALUES('09825 000000');
CREATE NONCLUSTERED INDEX IX_NotPersisted ON testTable(c_areaCode);
CREATE NONCLUSTERED INDEX IX_Persisted ON testTable(cp_areaCode);
E quindi eseguire le seguenti query:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;
Dopo aver esaminato il piano di query per il codice precedente, posso vedere che entrambe le query selezionate utilizzano l'indice non persistente. Ancora una volta, come?
