如果我在表格中包含计算列,是否会对其产生性能负担?
例如,如果我的表定义如下:
CREATE TABLE users(
givenname …,
familyname …,
fullname AS givenname+' '+familyname
);
...每次SELECT
从查询中重新计算?
如果计算列为PERSISTED
?
答案 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
执行计划显示两个标量运算符(尽管费用较少),如果您可以在右上角看到定义...您可以看到它们在每次引用时计算
答案 2 :(得分:0)
是的,如果计算列是PERSISTED,则在选择数据时没有性能问题(但插入它们时)。
是的,每次选择数据时都会计算出来。