SQL Server 2008 XML列性能问题

时间:2011-09-06 19:42:36

标签: sql xml performance

我们有一个包含XML列的表,其中包含相当多的数据,这在我们的开发环境中运行良好,但随着表的大小增加(接近10,000行),我们开始看到性能问题。

仅仅做SELECT *需要12秒......

有任何补救措施的建议吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

你可以查看几件事情 - 至少如果性能影响主要是在处理和从XML列中选择数据时:

  • 您可以放置​​index on your XML column - 如果您需要从XML列中获取大量数据,这可能会有所帮助。需要注意的一点是:XML索引使用很多的磁盘空间 - 在我们的例子中,1.5GB的数据库在磁盘大小上飙升至11GB ....请谨慎使用!

    < / LI>
  • 您可以将XML中的某些元素“显示”到“父”表中作为计算的,持久化的列,从而更快地找到所需的行(需要存储的函数 - 但这确实是一项非常好的技术如果你有这个需要)

另外:永远不要做SELECT * - 如果你不需要XML列 - 不要选择它 - 它会非常冗长并使用相当多的内存。

答案 1 :(得分: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列上创建索引。

答案 2 :(得分: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

Microsoft here对此进行了记录,您可以通过运行带有统计信息的查询来检查您之前和之后的内容。以下是您打开统计信息的方式:

SET STATISTICS IO ON;
SET STATISTICS TIME ON;