Enquanto lia meu livro de exames 70-433, pensei em algo que posso ver que não está funcionando, mas acredito que funcione. A passagem dizia algo como:
A coluna também deve ser marcada como PERSISTED , o que significa que o SQL Server armazena fisicamente o resultado da expressão da coluna computada na linha de dados em vez de calculá-la sempre que é referenciada em uma consulta.
Disso entendo duas coisas:
- Uma coluna computada não persistente é calculada toda vez que é referenciada em uma consulta
- Como nada é armazenado para a coluna computada, presumo que nenhum índice possa ser criado para a coluna.
Depois de ler, achei um pouco estranho, pois consegui criar um índice em uma coluna não persistente em um projeto anterior.
Como criar um índice para algo que não persiste e isso é prejudicial a longo prazo?
Para provar isso, executei a seguinte instrução 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 então execute as seguintes consultas:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode FROM testTable;
Tendo examinado o plano de consulta para o código acima, posso ver que ambas as consultas selecionadas estão usando o índice não persistente. Mais uma vez, como?
Essa suposição não é verdadeira — qualquer tipo pode ser indexado . A coluna computada deve ser determinística em ambos os casos, mas quando a coluna computada é persistida, o requisito de que o cálculo também seja preciso é relaxado (ou seja, pode envolver operações de ponto flutuante).
O resultado da função é 'persistente' no índice em ambos os casos - a única diferença é se persiste na tabela.