SQL服务器:计算列是否有性能成本?

SQL Server: Is there a performance cost to computed columns?

如果我在 table 中包含一个计算列,它是否会给它带来性能负担?

例如,如果我有一个table定义如下:

CREATE TABLE users(
    givenname …,
    familyname …,
    fullname AS givenname+' '+familyname
);

…每次我从查询中SELECT重新计算吗?

如果计算列是 PERSISTED 会有帮助吗?

是的,如果计算列是 PERSISTED,则 selecting 数据没有性能问题(但插入数据时有)。

是的,每次您 select 数据时都会计算它。

does it recalculate every time I SELECT from the query

如果 该列是查询中的引用,则在查询期间将至少执行一次计算。这是避免 select * ... 的(又一个)很好的理由 - 如果您对 users table 的查询未引用 fullname 列,则不会进行任何计算执行。

Would it help if the computed column is PERSISTED

显然,不需要执行计算,但您现在需要支付少量存储空间和 I/O 费用以进行 检索 持久化数据。

但简而言之,不要试图猜测这些事情。如果这是一个常见的计算,请为其创建一个计算列。稍后,一旦你有了 绩效目标 并且可以 衡量 你的绩效,你就可以评估它是否具有 意义 性能问题以及 persisted 权衡(计算与存储)是否对此有任何影响。

我的测试表明,即使您保留该列,每次 select ..

下面是一些测试数据

create table numm
(
id int,
 col_not_persist  as id+1,
col_persist as id+1 persisted
)

insert into numm
(id)
select number from Numbers--just numbers from 1 -1000000

现在查询时

select * from numm

执行计划显示了两个标量运算符(虽然成本较低),如果您可以看到右上角的定义..您可以看到每次引用它们时都会计算它们