我有一个基于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]
答案 0 :(得分:0)
GarethD是正确的。 SQL中的持久列令人沮丧。你添加他们认为他们会提高性能。如果要持久缓存ID * 5等值或任何其他计算,只需添加另一列并计算一次值并存储结果。