【问题标题】: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会有帮助吗?

【问题讨论】:

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


    【解决方案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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        相关资源
        最近更新 更多