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 中的性能?

计算sql查询的性能

Cosmos db 图与 Azure Sql Server - 性能和成本

使用 TinyInt 还是 Bit 对 SQL Server 有影响吗?大小和查询性能