当我选择一个持久的计算列时,为什么SQL Server“Compute Scalar”?

时间:2015-07-06 08:31:09

标签: sql sql-server sql-server-2005

我有一个基于XML字段的持久列,当我查询此表时,SQL Server总是使用“Compute Scalar”。为什么?是不是坚持了?

我怀疑我没有做任何阻止列真正持久化的条件。 这是我的表(以及创建持久列所需的功能):

create FUNCTION [dbo].[FuncTestPersisted] (@xml XML)
RETURNS int
WITH SCHEMABINDING
AS
BEGIN
RETURN @xml.value('(/node/@value)[1]','int')
END


create TABLE test_TB(
    [ID] [int] NOT NULL,
    [CustomProps] [xml] NULL,   
    [TestPersisted]  AS ([dbo].[FuncTestPersisted]([CustomProps])) PERSISTED,
 CONSTRAINT [PK_test_TB] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

我将非常感谢避免“计算标量”调用的每一个建议。请不要使用触发器(每个计算的列的一个触发器是.......太多工作;)

我也尝试过这个表,并且查询执行计划仍然显示“Compute Scalar”调用。为什么?

create TABLE [dbo].[test_TB](
    [ID] [int] NOT NULL,
    [CustomProps] [xml] NULL,
    [TestPersisted]  AS (5*ID) PERSISTED,
 CONSTRAINT [PK_test_TB] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

1 个答案:

答案 0 :(得分:0)

GarethD是正确的。 SQL中的持久列令人沮丧。你添加他们认为他们会提高性能。如果要持久缓存ID * 5等值或任何其他计算,只需添加另一列并计算一次值并存储结果。