【发布时间】:2015-09-23 07:40:13
【问题描述】:
我有一个基于 XML 字段的 persisted 列,当我查询此表时,SQL Server 总是使用“计算标量”。为什么?是不是持久化了?
我怀疑我没有做任何阻止列真正持久化的条件。 这是我的表(以及创建持久列所需的功能):
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]
我将非常感谢避免“计算标量”调用的每一个建议。请不要使用触发器(每个计算列的一个触发器是......太多的工作;))
我也尝试过使用此表,查询执行计划仍然显示“计算标量”调用。为什么?
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]
【问题讨论】:
-
This answer 应该会有所帮助。
-
我见过这个。谢谢。但解决方案是:没有解决方案,也没有理由...... :(
-
@Tirma 微软支持论坛答案中的链接表明,在某些情况下,可以重写查询,以便不重新计算值。可以试试吗?
-
查看计算机缩放器的定义值属性。它可能不会重新计算列,它可能只是对列或引擎要求的其他内容进行别名处理,并且不会影响您的查询性能。
标签: sql sql-server sql-server-2005