Estou com dificuldades para encontrar qualquer documentação sobre como o SQL Server realmente armazena uma coluna computada não persistente.
Veja o seguinte exemplo:
--SCHEMA
CREATE TABLE dbo.Invoice
(
InvoiceID INT IDENTITY(1, 1) PRIMARY KEY,
CustomerID INT FOREIGN KEY REFERENCES dbo.Customer(CustomerID),
InvoiceStatus NVARCHAR(50) NOT NULL,
InvoiceStatusID AS CASE InvoiceStatus
WHEN 'Sent' THEN 1
WHEN 'Complete' THEN 2
WHEN 'Received' THEN 3
END
)
GO
--INDEX
CREATE NONCLUSTERED INDEX IX_Invoice ON Invoice
(
CustomerID ASC
)
INCLUDE
(
InvoiceStatusID
)
GO
Eu entendo que ele é armazenado no nível da folha, mas se o valor não for persistente, como algo é armazenado? Como o índice ajuda o SQL Server a encontrar essas linhas nessa situação?
Qualquer ajuda muito apreciada,
Muito Obrigado,
EDITAR:
Obrigado a Brent & Aaron por responderem, aqui está o PasteThePlan mostrando claramente o que eles explicaram.
sql-server
sql-server-2012
index
computed-column
Uberzen1
fonte
fonte
Respostas:
Quando o SQL Server cria o índice no campo computado, o campo computado é gravado no disco naquele momento - mas apenas nas páginas de 8K desse índice. O SQL Server pode calcular o InvoiceStatusID conforme ele lê o índice em cluster - não há necessidade de gravar esses dados no índice em cluster.
À medida que você exclui / atualiza / insere linhas no dbo.Invoice, os dados nos índices são mantidos atualizados. (Quando InvoiceStatus é alterado, o SQL Server também sabe atualizar IX_Invoice.)
A melhor maneira de ver isso por si mesmo é realmente fazê-lo: crie esses objetos e execute atualizações que tocam no campo InvoiceStatusID. Poste o plano de execução (PasteThePlan.com é útil para isso) se desejar ajuda para ver onde as atualizações do índice estão acontecendo.
fonte
O valor para uma coluna computada indexada e não persistente não é persistente nas páginas de dados da tabela , mas é persistido nas páginas do índice . Ele permanece sem persistência na tabela, independentemente de persistir em 0, 1 ou em vários índices.
Apenas para ilustrar a descrição de Brent, tomando o exemplo que você deu, vamos inserir uma linha:
Agora, vamos ver as páginas de índice:
(Obviamente
dbname
, mude e o ID do índice pode não ser 2 no seu caso.)Saída (a sua certamente será diferente):
E, finalmente, vamos inspecionar a página para
PageType
2:(Você provavelmente precisará alterar 7 para corresponder ao seu ID do banco de dados e, se tiver vários arquivos de dados, poderá ser necessário alterar o segundo argumento para corresponder
PageFID
ao primeiro resultado.)Resultado:
Está na página de índice.
fonte
O atributo
PERSISTED
para uma coluna computada refere-se à persistência dos valores na tabela (índice clusterizado ou heap) e não à persistência dos valores no índice.O
CREATE INDEX
possui os requisitos para as limitações relacionadas a colunas e índices calculados:Não há limitação se a coluna computada é mantida ou não.
e mais (não sobre as colunas incluídas, mas sobre as calculadas na parte principal de um índice):
fonte