FOR XML ... TYPE 比 FOR XML 慢多少?

FOR XML ... TYPE much slower than FOR XML?

运行SQL Server 2014。我有一个 returns 相当大 XML 的存储过程。它是这样的:

SELECT(
   ...
   FOR XML PATH (N''), ROOT, TYPE

现在,该查询在 1 秒内运行。如果我删除 TYPE 它会在大约一半的时间内运行:

SELECT(
   ...
   FOR XML PATH (N''), ROOT

显然,后者 returns 是 nvarchar(max) 而不是 xml。我想要 xml 数据,但如果我要求 xml 它会变慢!如果我想在客户端获取 xml 数据,真的有必要使用上面的 TYPE 指令将其转换为 xml 吗?

问: 无论如何,为什么 FOR XML ... TYPE 明显 FOR XML ... 慢?有什么办法可以提高转化率吗?

您是否尝试将结果设置为 XML 和 VARCHAR(MAX) 而不 显示它们?也许您测量的时差必然会为观看者做好准备?将第一个字母粘贴到网格列中比创建格式正确、缩进、可显示的更快 XML...

在大多数情况下不需要指定 "TYPE"。你真的 只需要 嵌套 XML。只需使用别名、PATH- 和 ROOT-literals 以及 - 当然 - 使用或不使用 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。如果您将它传输到您的应用程序,它将是一个普通字符串。

结论:采用更快的方法:-)

顺便...

我不知道你的存储过程,除了 SELECT...

在大多数情况下,使用 SP 只是为了读取数据是一个坏习惯。

如果您的 SP 只是 SELECT 的包装器,您应该考虑一个 (single-statement!) table 值函数来检索您的数据。

此函数很容易查询并转换为 XML 和

SELECT *
FROM dbo.MyFunction(/*Parameters*/)
FOR XML PATH('TheRowsName'),ROOT('TheRootName') [,TYPE]

或者 - 如果您每次都需要它作为 XML,您可以定义一个提供 XML 或 VARCHAR(MAX) 的标量函数。 re-usability 函数比 SP 好得多...