Я работаю над повышением производительности старой хранимой процедуры. В настоящее время он получает XML-параметр одного узла, переданный из другой хранимой процедуры. Затем XML используется в перекрестном применении. Мне интересно, извлекает ли X-Query в CROSS APPY значение построчно или оно анализируется заранее. Было бы меньше накладных расходов для меня, если бы я передал список как 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 с одним столбцом, а затем выполнил бы внутреннее соединение с ним, увидел бы я улучшение производительности?