我的表格包含calcIncome
计算列:
CREATE TABLE foo
(
id int,
name varchar(100),
[other columns],
calcIncome AS dbo.fn_calcIncome() PERSISTED NOT NULL
)
询问:
select *
from foo
where calcIncome > 100
即使我设置calcIncome
为PERSISTED
,此查询仍然需要fn_calcIncome
每一行。
PERSISTED
那么,如果计算列的行为与非持久计算列相同,那么设置计算列的目的到底是什么?
来自 Paul White 的文章正确保留计算列
因此,防止重新评估计算(包括 UDF)并不是设计目标。
但文章也提到有一个跟踪标志 176 在这方面可以提供帮助。
一般来说,对于计算列,无论该列是否被标记为
persisted
在数据页中,您都可以对其建立索引,然后可以使用索引中存储的值进行索引查找。但我刚刚测试过这一点,并且当索引构建在引用 UDF 的列上时也无法进行搜索PERSISTED
(没有将列标记为和跟踪标志 176)。我很少使用引用标量 UDF 的计算列,因为它们也对并行性有影响。