传递 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 与传递用户定义类型的主要内容,如果未能解决你的问题,请参考以下文章