我们有一个包含XML列的表,其中包含相当多的数据,这在我们的开发环境中运行良好,但随着表的大小增加(接近10,000行),我们开始看到性能问题。
仅仅做SELECT *
需要12秒......
有任何补救措施的建议吗?
提前致谢。
答案 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;