【发布时间】: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 的版本。我们不同环境中的数据是如此不同,以至于我很少在它们之间得到相同的执行计划。所以你的“一般”评论就是我想要的。我想从高层次上知道它是否值得尝试。谢谢!
标签: sql-server-2008 stored-procedures user-defined-types xquery-sql