SQL Server:计算列的性能成本是多少?

时间:2017-09-29 06:25:19

标签: sql-server calculated-columns query-performance

如果我在表格中包含计算列,是否会对其产生性能负担?

例如,如果我的表定义如下:

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

...每次SELECT从查询中重新计算?

如果计算列为PERSISTED

,会有帮助吗?

3 个答案:

答案 0 :(得分:5)

  

每次从查询中选择时都会重新计算

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

  

如果计算列是PERSISTED

,它会有帮助吗?

显然,不需要执行计算,但您现在需要为检索持久化数据支付少量存储和I / O成本

但总之,不要试图再猜测这些事情。如果这是常见计算,请为其创建计算列。稍后,一旦您拥有性能目标并且衡量您的性能,您就可以评估它是否存在有意义的性能问题以及是否{{1 trade off(计算与存储)对此有任何影响。

答案 1 :(得分:1)

我的测试表明,即使你坚持列,每次选择时都会计算..

下面是一些测试数据

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

执行计划显示两个标量运算符(尽管费用较少),如果您可以在右上角看到定义...您可以看到它们在每次引用时计算

enter image description here

答案 2 :(得分:0)

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

是的,每次选择数据时都会计算出来。