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

时间:2014-04-08 19:19:39

标签: sql-server-2008 stored-procedures user-defined-types xquery-sql

我正在努力提高旧存储过程的性能。目前,它正在从另一个存储过程传递单节点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,然后将内部连接转换为它,我是否应该看到性能提升?

1 个答案:

答案 0 :(得分:0)

这是基于您的数据计数。如果传递更多数据意味着,则可以使用UDT,否则可以使用XML。因为当您传递更多数据时,XML解析会花费更多时间。所以这是基于你的要求。