SQL服务器:计算列是否有性能成本?
SQL Server: Is there a performance cost to computed columns?
如果我在 table 中包含一个计算列,它是否会给它带来性能负担?
例如,如果我有一个table定义如下:
CREATE TABLE users(
givenname …,
familyname …,
fullname AS givenname+' '+familyname
);
…每次我从查询中SELECT
重新计算吗?
如果计算列是 PERSISTED
会有帮助吗?
是的,如果计算列是 PERSISTED,则 selecting 数据没有性能问题(但插入数据时有)。
是的,每次您 select 数据时都会计算它。
does it recalculate every time I SELECT from the query
如果 该列是查询中的引用,则在查询期间将至少执行一次计算。这是避免 select * ...
的(又一个)很好的理由 - 如果您对 users
table 的查询未引用 fullname
列,则不会进行任何计算执行。
Would it help if the computed column is PERSISTED
显然,不需要执行计算,但您现在需要支付少量存储空间和 I/O 费用以进行 检索 持久化数据。
但简而言之,不要试图猜测这些事情。如果这是一个常见的计算,请为其创建一个计算列。稍后,一旦你有了 绩效目标 并且可以 衡量 你的绩效,你就可以评估它是否具有 意义 性能问题以及 persisted
权衡(计算与存储)是否对此有任何影响。
我的测试表明,即使您保留该列,每次 select ..
下面是一些测试数据
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
执行计划显示了两个标量运算符(虽然成本较低),如果您可以看到右上角的定义..您可以看到每次引用它们时都会计算它们
如果我在 table 中包含一个计算列,它是否会给它带来性能负担?
例如,如果我有一个table定义如下:
CREATE TABLE users(
givenname …,
familyname …,
fullname AS givenname+' '+familyname
);
…每次我从查询中SELECT
重新计算吗?
如果计算列是 PERSISTED
会有帮助吗?
是的,如果计算列是 PERSISTED,则 selecting 数据没有性能问题(但插入数据时有)。
是的,每次您 select 数据时都会计算它。
does it recalculate every time I SELECT from the query
如果 该列是查询中的引用,则在查询期间将至少执行一次计算。这是避免 select * ...
的(又一个)很好的理由 - 如果您对 users
table 的查询未引用 fullname
列,则不会进行任何计算执行。
Would it help if the computed column is PERSISTED
显然,不需要执行计算,但您现在需要支付少量存储空间和 I/O 费用以进行 检索 持久化数据。
但简而言之,不要试图猜测这些事情。如果这是一个常见的计算,请为其创建一个计算列。稍后,一旦你有了 绩效目标 并且可以 衡量 你的绩效,你就可以评估它是否具有 意义 性能问题以及 persisted
权衡(计算与存储)是否对此有任何影响。
我的测试表明,即使您保留该列,每次 select ..
下面是一些测试数据
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
执行计划显示了两个标量运算符(虽然成本较低),如果您可以看到右上角的定义..您可以看到每次引用它们时都会计算它们