传递 XML 与传递用户定义类型

Posted

技术标签:

【中文标题】传递 XML 与传递用户定义类型【英文标题】:Passing XML vs Passing User Defined Type 【发布时间】:2014-04-08 19:19:39 【问题描述】:

我正在努力提高旧存储过程的性能。目前它正在获取从另一个存储过程传递的单节点 XML 参数。然后在交叉应用中使用 XML。我想知道 CROSS APPY 中的 X-Query 是逐行提取值,还是事先对其进行了解析。将列表作为 UDT 而不是 XML 传递对我来说开销会更少吗

这是生成 XML 的代码

SELECT @NewRunBatchProcessSteps = (
    SELECT Tracking.NewPrimaryKey RunBatchProcessStepId
    FROM @RunBatchProcessStep AS RunBatchProcessStep
        INNER JOIN @RunBatchProcessNew Tracking ON RunBatchProcessStep.RunBatchProcessStepId = Tracking.OldPrimaryKey
    FOR XML PATH('RunBatchProcessStep'), ROOT ('RunBatchProcessSteps')
)

这是它的使用方法。

SELECT SomeFields
FROM RunBatchProcessStep 
CROSS APPLY @NewRunBatchProcessSteps.nodes('/RunBatchProcessSteps/RunBatchProcessStep') RunBatchProcessStepsXML(ref)
INNER JOIN BatchProcessStep btp ON RunBatchProcessStep.BatchProcessStepId = btp.BatchProcessStepId
INNER JOIN Module m ON m.ModuleCode = btp.ModuleCode
WHERE RunBatchProcessStep.RunBatchProcessStepId = ref.value('RunBatchProcessStepId[1]', 'INT')

如果我要采用 @NewRunBatchProcessSteps 并将其转换为单列 UDT,然后对其进行 Inner Join,我应该看到性能改进吗?

【问题讨论】:

你应该试试看。 但是一般,是的,将一系列值作为用户定义的表类型传递应该比 XML 更有效。但您的里程可能会因情况而异。 谢谢。我正在制作一个适用于 UDT 的版本。我们不同环境中的数据是如此不同,以至于我很少在它们之间得到相同的执行计划。所以你的“一般”评论就是我想要的。我想从高层次上知道它是否值得尝试。谢谢! 【参考方案1】:

这取决于您的数据计数。如果传递更多数据方式,则可以使用 UDT,否则可以使用 XML。因为当您传递更多数据时,XML 解析需要更多时间。所以这取决于你的要求。

【讨论】:

以上是关于传递 XML 与传递用户定义类型的主要内容,如果未能解决你的问题,请参考以下文章

AJAX的返回类型json与xml

如何将用户定义的类型作为输入传递给存储过程?

引用类型变量,对象,值类型,值传递,引用传递 区别与定义

MsSQL 未使用 sp_executesql 传递用户定义的表类型

在 SQL Server 数据库之间传递用户定义的表类型

js 函数参数传递引用类型与基本类型