Comportamento estranho com colunas computadas no SQL-Server

12

Enquanto lia meu livro de exames 70-433, pensei em algo que posso ver não funcionando, mas acredito que funciona. 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 for referenciada em uma consulta.

A partir disso, entendo duas coisas:

  1. Uma coluna computada não persistente é calculada toda vez que é referenciada em uma consulta
  2. Como nada é armazenado para a coluna computada, presumo que nenhum índice possa ser criado para a coluna.

Depois de ler, achei que isso era um pouco estranho, pois consegui criar um índice em uma coluna não persistente em um projeto anterior.

Como um índice pode ser criado 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, em seguida, 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. Novamente, como?

insira a descrição da imagem aqui

Stuart Blackler
fonte
Para aqueles que têm o livro 70-433, o texto citado está no topo da página 111.
Stuart Blackler

Respostas:

9

2.Como nada é armazenado para a coluna computada, presumo que nenhum índice possa ser criado para a coluna.

Essa suposição não é verdadeira - qualquer um dos tipos pode ser indexado . A coluna calculada deve ser determinística nos dois casos, mas quando a coluna calculada é mantida, o requisito de que a computação também seja precisa é diminuído (ou seja, pode envolver operações de ponto flutuante).

Como um índice pode ser criado para algo que não persiste e isso é prejudicial a longo prazo?

O resultado da função é 'persistente' no índice nos dois casos - a única diferença é se ela persiste na tabela.

Jack diz que tenta topanswers.xyz
fonte