为什么在SELECT查询中包含XML列会对查询性能产生如此根本的负面影响?

时间:2013-11-07 09:16:00

标签: sql sql-server performance azure-sql-database xml-column

我几周来一直在努力解决查询性能问题。在这一点上,我已经在JOIN类型,索引,保持统计最新等方面完全挤出了查询的所有内容......等等......但后来偶然发现了一些事情。

一点背景。

相关表格代表Record

Id INT PK
Name NVARCHAR(50)
Status INT FK 
Created DATETIME
Version NVARCHAR(10)
Data XML

经过一些性能基准测试后,我意识到在select中包含最后一列远远超过了索引,连接复杂性等等。网络考虑因素介于10倍和10倍之间20X。

在连接到SQL Azure的本地开发计算机上的SSMS之间进行了以下比较。

SELECT Id FROM Records -- ~10 secs for 300,000 rows
SELECT Id, Name, Status, Created, Version FROM Records -- ~20 sec for 300,000 rows
SELECT * FROM Records -- ~350 sec for 300,000 rows

要清楚,我没有对xml列(XML DML或XPath查询)做任何疯狂的事情。只需在选择中包含/排除它。

此时,我认为我已经通过创建RecordLight实体,NHibernate Map& MVC控制器堆栈,纯粹用于搜索&在我们的应用程序中列出。

但我想了解为什么包含XML列会对查询性能产生负面影响

2 个答案:

答案 0 :(得分:2)

要考虑的一件事是XML数据的字节大小。

例如,如果要连接到远程数据库服务器,则需要将所有数据下载到客户端(即使客户端是SSMS)。

我在blob列中看到了相同的内容,例如包含MB的数据。

如果您执行以下操作:

SELECT Id, LEFT(Data, 10) FROM Records

您是否看到同时返回数据?

答案 1 :(得分:1)

是否与XML数据如何存储在SQL Server使用的文件中有关?与其他大型数据类型(如BLOB)存在类似的性能问题吗?如果XML列的实际内容(可能是一个非常大的文件)分布在其他文件中,那么我可以想象这需要时间让SQL“拼接”在一起。