【问题标题】:Why does SQL Server “Compute Scalar” when I SELECT a persisted computed column?为什么当我选择一个持久计算列时 SQL Server “计算标量”?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2012-08-05
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多