我的包含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的目的究竟是什么呢?

推荐答案

保罗·怀特的文章Properly Persisted Computed Columns

持久化计算列是专门添加到产品中的 允许索引建立在确定性但不精确的基础上(浮动 点)列

因此,防止重新判断计算--包括UDF--不是设计目标.

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

通常,对于计算列,无论该列在数据页中是否标记为persisted,都可以对其进行索引,然后使用存储在索引中的值进行索引查找.但是当索引建立在引用UDF的列上时,我刚刚测试了它和wasn't able to get a seek(没有同时将该列标记为PERSISTED和跟踪标志176).

我很少使用引用标量UDF的计算列,因为它们也意味着并行性.

Sql相关问答推荐

有没有一种正确的方法来利用SQL UNION来从三个潜在查询中 Select 最大值?

如何从多行数据中获取一行合并数据?

retrofit AWS Athena中的JSON

如何使用WSO2将空值传递给我的SQL Server存储过程?

Django将字符串筛选为整数?

在数据库中搜索列

导出部分条形码字符串GS1-128

在SQL中为两个日期之间的每个日期添加行

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

如何用QuestDB生成蜡烛图?

使用拆分器将已分组的不同值连接在一起

插入具有预期逻辑的查询以Forking 表

在特定条件下使用 LAG,确定要采用什么 LAG 值?

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

Postgres如何在一个日历周中前进和回填值

多行状态下的分组查询判断状态

在 MS Access 中连接相关记录

从每行中排除最大元素

使用一组值进行分组和计数

如何在 Trino/Presto 中过滤掉 map 中的某些键?