将计算列设置为 PERSISTED 的目的是什么?

Ang*_*ker 4 sql t-sql sql-server sql-server-2017

我的表格包含calcIncome计算列:

CREATE TABLE foo
(
    id int, 
    name varchar(100),
    [other columns], 
    calcIncome AS dbo.fn_calcIncome() PERSISTED NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

询问:

select * 
from foo
where calcIncome > 100
Run Code Online (Sandbox Code Playgroud)

即使我设置calcIncomePERSISTED,此查询仍然需要fn_calcIncome每一行。

PERSISTED那么,如果计算列的行为与非持久计算列相同,那么设置计算列的目的到底是什么?

Mar*_*ith 5

来自 Paul White 的文章正确保留计算列

持久计算列被添加到产品中,专门用于允许在确定性但“不精确”(浮点)列上构建索引

因此,防止重新评估计算(包括 UDF)并不是设计目标。

但文章也提到有一个跟踪标志 176 在这方面可以提供帮助。

一般来说,对于计算列,无论该列是否被标记为persisted在数据页中,您都可以对其建立索引,然后可以使用索引中存储的值进行索引查找。但我刚刚测试过这一点,并且当索引构建在引用 UDF 的列上时也无法进行搜索PERSISTED(没有将列标记为和跟踪标志 176)。

我很少使用引用标量 UDF 的计算列,因为它们也对并行性有影响。