我正在努力提高旧存储过程的性能。目前,它正在从另一个存储过程传递单节点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,然后将内部连接转换为它,我是否应该看到性能提升?
答案 0 :(得分:0)
这是基于您的数据计数。如果传递更多数据意味着,则可以使用UDT,否则可以使用XML。因为当您传递更多数据时,XML解析会花费更多时间。所以这是基于你的要求。