FOR XML ... TYPE比FOR XML慢得多吗?

时间:2016-01-07 15:06:17

标签: sql-server xml tsql sqlxml

正在运行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 ...?有没有办法改善转换?

1 个答案:

答案 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的包装器,您应该考虑一个(单语句!)表值函数来检索您的数据。

可以使用

轻松查询此函数并将其转换为XML
SELECT *
FROM dbo.MyFunction(/*Parameters*/)
FOR XML PATH('TheRowsName'),ROOT('TheRootName') [,TYPE]

或者 - 如果您每次都需要这个XML,您可以定义一个提供XML或VARCHAR(MAX)的标量函数。功能的可重用性比使用SP更好......