2011-09-06 89 views
1

我们有一个XML列支持相当多的数据的表,这在我们的开发环境中工作正常,但随着表增长(接近10,000行),我们开始看到性能的问题。SQL Server 2008 XML列性能问题

只是做SELECT *需要单独12秒...

任何建议,以解决这个问题?

在此先感谢。

+0

您是否在桌面上有必要的索引?我怀疑数据行大小太大,只需要很多时间来返回数据... –

+0

你是如何做'SELECT *'? –

回答

1

你可以检查出几件事情 - 至少是对性能的影响主要是与处理,并从XML列中选择数据时:

  • 你可以把一个index on your XML column - 这可以帮助,如果您需要从XML列中获取大量数据。值得注意的一点是:XML索引使用很多磁盘空间的 - 在我们的例子中,1.5GB的数据库飙升到11GB的磁盘大小....谨慎使用!

  • 您可以将XML中的某些元素“表面化”到“父”表上作为计算的持久列,从而更快速地找到所需的行(需要存储的函数 - 但是,如果它是一种非常好的技术,你有这方面的需求)

另外:永远做一个SELECT *无论如何 - 如果你不需要XML列 - 不选择它 - 这将是非常详细,并使用相当多的内存。

0

只是添加了一些什么marc_s说:我也会推荐一个索引 - 10K记录不是很多。但请确保您正确地添加索引 - 通常放置索引的最佳位置是用于JOIN条件,WHERE子句或ORDER BY子句的列。如果您的查询在这些情况下没有使用XML本身,则可以通过在不同列上创建索引来更好地服务您(例如,如果您正在查找非XML列中的ID,则可能会看到通过在ID上创建索引来获得更多益处)。

如果实际提取XML数据的速度很慢,您可以考虑制作一个覆盖索引(使用INCLUDE关键字),其中您有一个ID索引,但INCLUDE表达式从XML列提取值。这对我的一个项目产生了巨大的影响,但是一如既往地确保测试性能。

当然,如果您的查询实际上在对XML数据执行JOIN/WHERE/ORDER BY,那么您应该可以执行marc_s建议并在XML列上创建索引。

+0

感谢这两个回复,这给了我一些想法,我们需要改进我们的应用程序。然而,目前我们的场景并不复杂,现在我们并没有在SQL中对XML进行太多查询,这个问题的用例是我们将整列和应用程序代码转换为一个对象,其余部分应用程序可以使用它,但是,一次只需拉动几千个这些需要时间。有了这个说法,并且假设我们拉整列,索引仍然会有帮助吗? – AVP06

+0

如果我们只取出部分XML节点而不是整列,它也会有什么区别吗? – AVP06

+0

通常,从数据库传输到客户端的数据越少,性能就越好。这就是为什么你应该避免“SELECT *”,而是只选择必要的列。同样,如果您可以减少返回的行数(通过筛选记录),这也会提高性能。如果索引对您的过滤有用,那么索引会加快速度。是的,拉动XML的一个子集也可能会有所帮助。很难说没有测试。 – JohnD

0

如果查询记录并过滤XML数据类型中的数据,则要求SQL Server检查所有XML内容以查找结果。

要加快速度,请将XML数据类型过滤器与全文搜索表达式结合使用。在对XML进行分析和搜索之前,全文搜索会缩小搜索结果(取决于您的具体情况)。它可以节省大量的CPU和IO。这里有一个例子:

SELECT * 
FROM Table 
WHERE CONTAINS(XmlColumn,'value') 
AND XmlColumn.exist('/element/element/text()[contains(.,"value")]') = 1 

这是微软here记录,并且您可以前后用统计运行你的查询检查。以下是关于如何打开统计信息的方法:

SET STATISTICS IO ON; 
SET STATISTICS TIME ON;