正在运行SQL Server 2014
。我有一个存储过程,返回一个非常大的XML
。它是这样的:
SELECT(
...
FOR XML PATH (N''), ROOT, TYPE
现在,该查询在1秒内运行。如果我删除TYPE
,它会在大约一半的时间内运行:
SELECT(
...
FOR XML PATH (N''), ROOT
显然,后者返回nvarchar(max)
而不是xml
。我想要xml数据,但如果我要求xml它会变慢!如果我想在客户端上获取xml数据,是否真的有必要使用上面的TYPE
指令将其转换为xml?
问:无论如何,为什么FOR XML ... TYPE
显着慢于FOR XML ...
?有没有办法改善转换?
答案 0 :(得分:2)
您是否尝试将结果设置为XML并将VARCHAR(MAX)设置为而不显示?也许您衡量的时差必然会为观众做准备?将第一个字母粘贴到网格列中比创建格式良好,缩进,可显示的XML更快......
大多数情况下不需要将“TYPE”分类。您只需使用嵌套XML 需要。只需使用别名,PATH和ROOT文字以及 - 当然 - 使用或不使用TYPE:
而且 - 非常重要! - 尝试用周围的SELECT调用它,不用:
SELECT
(
SELECT tbls.TABLE_NAME AS [@TableName]
,(
SELECT COLUMN_NAME AS [@ColumName]
FROM INFORMATION_SCHEMA.COLUMNS AS cols
WHERE cols.TABLE_NAME=Tbls.TABLE_NAME
FOR XML PATH('COLUMN') /*,TYPE*/
) /*AS alias*/
FROM INFORMATION_SCHEMA.TABLES AS Tbls
FOR XML PATH('TABLE'),ROOT('ALL_TABLES') /*,TYPE*/
) /*AS alias*/
我不知道,您如何继续使用生成的XML。如果你将它转移到你的应用程序,无论如何它将是一个普通的字符串。
Conclusio:采取更快的方法: - )
顺便说一句......
除了SELECT ...
之外,我不知道您的存储过程以及除此之外还做了什么在大多数情况下,仅仅使用SP读取数据是一个坏习惯。
如果您的SP不仅仅是SELECT的包装器,您应该考虑一个(单语句!)表值函数来检索您的数据。
可以使用
轻松查询此函数并将其转换为XMLSELECT *
FROM dbo.MyFunction(/*Parameters*/)
FOR XML PATH('TheRowsName'),ROOT('TheRootName') [,TYPE]
或者 - 如果您每次都需要这个XML,您可以定义一个提供XML或VARCHAR(MAX)的标量函数。功能的可重用性比使用SP更好......