使用XPath查询XML列的T-SQL非常慢 - 如何改进或选择?

问题描述:

我有一个包含XML数据类型列的表。现在的方法是使用XPath来查询XML中的值。不幸的是,这种方法变得非常缓慢。使用XPath查询XML列的T-SQL非常慢 - 如何改进或选择?

该表有大约500,000行。它实际上是一个每天接收新数据的登台表,因此在列上应用XML索引是不切实际的 - 每日INSERT操作需要数小时才能完成。没有索引,大约在一分钟内完成。

有没有其他办法可以更快地查询这个XML数据?

+0

如果你需要某种持续性指标,也许XML是不是你的格式... – 2010-11-10 22:10:55

+0

不需要索引 - XML索引似乎是我找到的常见解决方案,所以我尝试了它,但对我的情况来说这似乎不实际。不幸的是,我对XML格式没有太多选择。 – capsaicin 2010-11-10 22:33:26

+0

是否可以修改应用程序/提供新数据的任何东西?因为MSSQL中的XML支持是一个可怕的错误,你应该在外面预处理这些数据。 – 2010-11-11 08:48:44

我们有相同的情况和数量的数据,并在调整结束后有一个插入&更新触发器将数据插入“数据仓库表”中。这给出了一个较慢的插入,但对我们的用户可行。

您需要定期查询XML中的多少项目?一些??

我们选择面临着同样的问题,解决的办法是这样的:

  • 创建一个存储功能,在该功能需要一个XML参数作为其输入
  • ,提取您从XML需要的信息使用XQuery/XPath的
  • 创建计算你的桌子上引用了功能持续列

通过这种方式,我们提取了三种,四种最常用的信息项(在我们的例子中通常只是一个INT),并将它们作为基表的列提供。由于它们是持久的,因此每次访问时都不会重新计算它们 - 仅当XML内容发生更改时才会重新计算它们;也因为它们被持久化了,如果需要的话,你可以在它们上面放置一个常规的非聚集索引。

例子:

我们已经提取从XML一个BIT告诉我们一个给定的合同是否有一个VPN连接或不是一个函数:给定一个XML

CREATE FUNCTION dbo.GetVPNFlag(@Data XML) 
RETURNS BIT 
WITH SCHEMABINDING 
AS BEGIN 
    DECLARE @VPNFlag BIT 

    SELECT 
    @VPNFlag = ISNULL(@Data.value('(EntryIP/VPNOption)[1]', 'bit'), 0) 

    RETURN @VPNFlag 
END 

,这将挑选出VPN标志并返回。接下来,我们创建了我们的基表中的计算列仍然存在:

ALTER TABLE dbo.ContractData 
    ADD IsVPN AS dbo.GetVPNFlag(XmlData) PERSISTED 

在这里,我们在XmlData内容正在传递从ContractData表,到函数。我们回来一个BIT,在ContractData表中存储为IsVPN列。

现在我们可以很容易地得到所有的合同与VPN这样的:

SELECT (list of fields) 
FROM dbo.ContractData 
WHERE IsVPN = 1