У меня есть запрос, который выглядит примерно так:
select xmlelement("rootNode",
(case
when XH.ID is not null then
xmlelement("xhID", XH.ID)
else
xmlelement("xhID", xmlattributes('true' AS "xsi:nil"), XH.ID)
end),
(case
when XH.SER_NUM is not null then
xmlelement("serialNumber", XH.SER_NUM)
else
xmlelement("serialNumber", xmlattributes('true' AS "xsi:nil"), XH.SER_NUM)
end),
/*repeat this pattern for many more columns from the same table...*/
FROM XH
WHERE XH.ID = 'SOMETHINGOROTHER'
Это некрасиво, и мне это не нравится, и это также самый медленный запрос (есть другие похожие по форме, но гораздо меньшего размера, и они пока не вызывают серьезных проблем). Техническое обслуживание относительно простое, так как это в основном сгенерированный запрос, но сейчас я беспокоюсь о производительности. Мне интересно, сколько накладных расходов есть для всех этих выражений.
Чтобы увидеть, есть ли какая-либо разница, я написал другую версию этого запроса как:
select xmlelement("rootNode",
xmlforest(XH.ID, XH.SER_NUM,...
(я знаю, что этот запрос не производит точно то же самое, мой план состоял в том, чтобы переместить логику для обработки атрибутов переименования и xsi: nil в XSL или, возможно, в PL / SQL)
Я пытался получить планы выполнения для обеих версий, но они одинаковы. Я предполагаю, что логика не учитывается в плане выполнения. Моя интуиция говорит мне, что вторая версия должна выполняться быстрее, но я хотел бы доказать это (кроме написания тестовой функции PL / SQL с инструкциями синхронизации до и после запроса и повторного запуска этого кода, чтобы получить тестовый образец).
Можно ли получить хорошее представление о том, сколько будет стоить этот случай?
Кроме того, я мог бы написать case-при использовании функции декодирования. Будет ли это работать лучше (чем заявления случая)?