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 好得多...
运行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 好得多...