SQL Server:计算列是不是有性能成本?
Posted
技术标签:
【中文标题】SQL Server:计算列是不是有性能成本?【英文标题】:SQL Server: Is there a performance cost to computed columns?SQL Server:计算列是否有性能成本? 【发布时间】:2018-03-11 00:12:32 【问题描述】:如果我在表中包含计算列,是否会给它带来性能负担?
例如,如果我有一个如下定义的表:
CREATE TABLE users(
givenname …,
familyname …,
fullname AS givenname+' '+familyname
);
…每次我从查询中SELECT
时,它会重新计算吗?
如果计算列是PERSISTED
会有帮助吗?
【问题讨论】:
【参考方案1】:每次我从查询中选择时都会重新计算
如果该列是查询中的引用,则在查询期间将至少执行一次计算。这是(又一个)避免使用select * ...
的好理由——如果您对未引用fullname
列的users
表进行查询,则不会执行任何计算。
如果计算列是 PERSISTED 会有帮助吗
显然,不需要执行计算,但您现在要为检索持久化数据支付少量存储和 I/O 成本。
但简而言之,不要试图猜测这些事情。如果这是一个常见的计算,请为其创建一个计算列。稍后,一旦您有了性能目标并且可以衡量您的性能,您就可以评估它是否存在有意义的性能问题以及persisted
权衡(计算与存储)对此有任何影响。
【讨论】:
除此之外,在从数据库中检索数据后,最好还检查计算该列服务器端。在 c#/php/etc 中计算比在 sql 中计算要好得多,并且您可以节省一些存储空间来消耗内存。 关于存储,我一般认为2018年,如果你担心存储,买一个更大的盒子。存储通常比性能便宜。在这个例子中。假设结果不需要重新计算,我应该想象如果你只想要fullname
,那么持久列在处理和 I/O 上都会更便宜。抱歉,我花了这么长时间才接受答案。【参考方案2】:
是的,如果计算列是 PERSISTED,则选择数据时没有性能问题(但插入数据时存在)。
是的,每次选择数据时都会计算一次。
【讨论】:
【参考方案3】:我的测试表明,即使您保留该列,每次选择时都会计算 ..
下面是一些测试数据
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
执行计划显示两个标量运算符(虽然成本较低),如果您可以看到右上角的定义..您可以看到它们每次被引用时都会计算出来
【讨论】:
以上是关于SQL Server:计算列是不是有性能成本?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
将行非规范化为列是不是会提高 SQL Server 中的性能?
列排序是不是会影响 Microsoft SQL Server 2012 中的性能?