Minha tabela com a calcIncome
coluna calculada:
CREATE TABLE foo
(
id int,
name varchar(100),
[other columns],
calcIncome AS dbo.fn_calcIncome() PERSISTED NOT NULL
)
Consulta:
select *
from foo
where calcIncome > 100
Mesmo que eu tenha definido calcIncome
como PERSISTED
, esta consulta ainda fn_calcIncome
exige cada linha.
Então, qual é exatamente o propósito de definir uma coluna calculada PERSISTED
se ela se comporta da mesma forma que colunas calculadas não persistentes?
Do artigo de Paul White Colunas computadas corretamente persistentes
Portanto, impedir a reavaliação dos cálculos – incluindo UDFs – não era o objetivo do projeto.
Mas o artigo também menciona que existe um sinalizador de rastreamento 176 que pode ajudar nesse aspecto.
Em geral, com colunas computadas, esteja a coluna marcada ou não como
persisted
na página de dados, você pode indexá-la e, em seguida, obter uma busca de índice usando o valor armazenado no índice. Mas acabei de testar isso e também não consegui obter uma busca quando o índice foi criado na coluna que faz referência a uma UDF (sem marcar a coluna comoPERSISTED
e o sinalizador de rastreamento 176).Raramente, ou nunca, uso colunas computadas que fazem referência a UDFs escalares, pois elas também têm implicações para o paralelismo.