Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 对于XML。。。输入速度比XML慢得多?_Sql Server_Xml_Tsql_Sqlxml - Fatal编程技术网

Sql server 对于XML。。。输入速度比XML慢得多?

Sql server 对于XML。。。输入速度比XML慢得多?,sql-server,xml,tsql,sqlxml,Sql Server,Xml,Tsql,Sqlxml,正在运行SQL Server 2014。我有一个存储过程,它返回相当大的XML。事情是这样的: SELECT( ... FOR XML PATH (N''), ROOT, TYPE 现在,该查询将在1秒内运行。如果我删除类型,它将在大约一半的时间内运行: SELECT( ... FOR XML PATH (N''), ROOT 显然,后者返回的是nvarchar(max),而不是xml。我想要xml数据,但如果我要求xml,它会变慢!如果我想在客户机上获取xml数据,

正在运行SQL Server 2014。我有一个存储过程,它返回相当大的
XML
。事情是这样的:

SELECT(
   ...
   FOR XML PATH (N''), ROOT, TYPE
现在,该查询将在1秒内运行。如果我删除
类型
,它将在大约一半的时间内运行:

SELECT(
   ...
   FOR XML PATH (N''), ROOT
显然,后者返回的是
nvarchar(max)
,而不是
xml
。我想要xml数据,但如果我要求xml,它会变慢!如果我想在客户机上获取xml数据,是否真的需要使用上面的
TYPE
指令将其转换为xml


Q:无论如何,为什么XML的
是。。。对于XML,键入
慢很多…
?有什么方法可以改进转换吗?

您是否尝试将结果设置为XML和VARCHAR(MAX)而不显示它们?也许你测量的时差一定会让观众做好准备?将第一个字母粘贴到网格列比创建格式良好、缩进、可显示的XML要快

大多数情况下不需要指定“类型”。您确实只需要使用嵌套的XML就可以了。只需使用别名、路径和根文本,当然,还可以使用或不使用类型:

而且——非常重要尝试使用周围的SELECT和NOTH调用此选项:

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。如果您将它传输到应用程序,它将是一个普通字符串

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

顺便说一下

我不知道你的存储过程,除了选择外还有什么其他的操作

在大多数情况下,仅使用SPs读取数据是一个坏习惯

如果您的SP只是SELECT的包装器,那么您应该考虑使用一个(单语句!)表值函数来检索数据

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

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

或者-如果您每次都需要将其作为XML,您可以定义一个传递XML或VARCHAR(MAX)的标量函数。函数的可重用性比使用SPs要好得多…

首先,在数据库世界中,2倍的差异通常不被认为是显著的。例如,
PATH()
AUTO()
模式之间的差异非常显著。第二,您是否尝试通过以相反顺序运行和/或使用冷数据缓存来比较它们?我在两次运行之间删除了存储过程。是否应该重置任何缓存?那么
AUTO
会更快吗?不,我的意思是在每次执行后使用
dbcc dropcleanbuffers
,以确保以前缓存的数据不会影响比较。而
for xml AUTO()
通常比
path()
慢得多,反之亦然。我得出的结论是转换为xml需要时间。我想知道转换是否能给你带来有价值的东西。可能是Xml语法验证?@l33t,是的,Xml转换为您提供验证。但是在任何情况下,您都可以依靠
FOR XML PATH()
创建有效的XML,因此没有额外的价值。你试过我回答的例子了吗?最大的区别是嵌套(子)select在周围XML中的集成方式。我会尽快尝试!由于xml已经过验证,如果转换速度确实很慢,我会感到惊讶。SSMS可能需要一些时间来使用xml呈现/初始化单元格。但我不知道这会如何影响统计时间,我很好奇。我刚刚尝试了四个调用,所有调用都带有以下
dbcc dropcleanbuffers
:不带类型、带类型、带类型和不带类型。所有四个调用占用25%的时间,并导致相同的执行计划。因此,正如预期的那样,差异来自其他地方。。。