Uma coluna computada tem seu valor calculado dinamicamente, através de uma expressão, que pode ou não referenciar outras colunas da mesma tabela. Ou seja, um comando DML não poderia definir o valor de uma coluna computada. Para definir uma coluna como computada deve se utilizar a palavra chave PERSISTED.
Qual é o ganho em se utilizar uma coluna com essa definição?
Eu vejo 2:
* Performance (como demostro abaixo), uma coluna que mantem o valor calculado “persistido” não precisa calcular em tempo de execução; É possível definir índices baseados em uma coluna computada.
* Centralização da regra, por mais simples que possa parecer, em um sistema de muitas especificações, um simples cálculo pode se tornar uma dor de cabeça (claro que a mesma regra pode estar na aplicação, mas nesse caso o ganho de performance vai ser menor, dependendo do caso).
Vamos criar um exemplo:
CREATE TABLE #Produto ( Nome VARCHAR(200), ValorUnitario DECIMAL(10, 2), PorcentagemDesconto DECIMAL(10, 3), Quantidade INT, SubTotal AS ((ValorUnitario * Quantidade) - (ValorUnitario * PorcentagemDesconto / 100) * Quantidade) --PERSISTED ); INSERT INTO #Produto (Nome, ValorUnitario, PorcentagemDesconto, Quantidade) VALUES('Produto 1', 100.10, 10, 10); INSERT INTO #Produto (Nome, ValorUnitario, PorcentagemDesconto, Quantidade) VALUES('Produto 2', 350.41, 6.9, 5); INSERT INTO #Produto (Nome, ValorUnitario, PorcentagemDesconto, Quantidade) VALUES('Produto 3', 90.75, 0.1, 10);
Primeiro criei uma tabela temporária com algumas colunas, a principal delas é SubTotal, ela devolverá o calculo do valor do produto, nesse primeiro momento não defini a coluna SubTotal como PERSISTED (está comentada); E inseri alguns produtos.
Se executarmos um select simples como este(lembre de visualizar o plano de execução: Ctrl + L), teremos o seguinte resultado:
SELECT * FROM #Produto2;
Você pode ver claramente que existe um operador adicional quando não se tem colunas persistentes. Isso ocorre quando o valor da coluna é calculado em tempo de execução. Para ser mais preciso, vamos ver o custo final da operação de leitura como segue:
Bom, agora temos uma forma de mensurar o quanto podemos ganhar com uma coluna PERSISTED. Vamos alterar a coluna da tabela temporária de produto para PERSISTED.
ALTER TABLE #Produto DROP COLUMN SubTotal; ALTER TABLE #Produto ADD SubTotal AS ((ValorUnitario * Quantidade) - (ValorUnitario * PorcentagemDesconto / 100) * Quantidade) PERSISTED;
Se visualizarmos novamente o plano de execução com o mesmo select executado anteriormente:
Vê-se claramente, que o custo é menor em comparação com o valor de coluna não-persistente. Quando o cálculo é complexo, uma coluna persistente melhora o desempenho de pré-calculo dos valores de colunas calculadas. Claro que a diferença do custo final foi baixa, mas o calculo que fiz também é muito simples.
Até a próxima pessoal!