Как ускорить мой запрос FOR XML SQL?

SELECT 
    *,
    ( -- Subquery to get associated rows in View2 as XML.
        SELECT
            *
        FROM View2
        WHERE
            View1_Print.SchedId = View2.SchedId AND
            PublishDay BETWEEN StartDate AND EndDate FOR XML PATH('Answer') 
    ) AS Answers
FROM View1_Print
FOR XML PATH('View1'), ROOT('ArrayOfView1');

Приведенный выше SQL правильно извлекает все строки в View1 вместе с XML-представлением связанных строк в View2, чего я и хочу. Проблема в том, что этот запрос выполняется четыре минуты. Каждое представление имеет несколько тысяч строк.

Когда я запускаю обычный запрос с оператором соединения, он выполняется всего за шесть секунд, но я ищу эффективный способ сериализации этого результата в XML. Вот мой запрос без XML, который выполняется за шесть секунд:

SELECT
*
FROM
View1 A
LEFT OUTER JOIN View2 B
    ON A.SchedId = B.SchedId AND B.PublishDay BETWEEN A.StartDate AND A.EndDate;

Он должен извлекать точно такой же формат, так почему же мой XML-запрос такой медленный?


person Vivian River    schedule 01.02.2014    source источник
comment
Планы исполнения, наверное, разные. . . Например, запрос for xml может использовать соединение с вложенным циклом. Можете ли вы опубликовать планы выполнения для двух запросов?   -  person Gordon Linoff    schedule 01.02.2014


Ответы (1)


Попробуйте использовать запрос с внешним применением вместо подзапроса, как показано ниже. Обратите внимание, что это не полный ответ, вам необходимо изменить его в соответствии с вашими требованиями и устранить ошибки, если таковые имеются.

SELECT *,Answers.A,Answers.B 
FROM View1_Print
OUTER APPLY  ( -- Subquery to get associated rows in View2 as XML.
        SELECT
            View2.Col1 as A,View2.Col2 as B
        FROM View2
        WHERE
            View1_Print.SchedId = View2.SchedId AND
            PublishDay BETWEEN StartDate AND EndDate FOR XML PATH('Answer') 
    ) AS Answers
FOR XML PATH('View1'), ROOT('ArrayOfView1');
person Mahmad Khoja    schedule 26.02.2014
comment
+1: я решил эту проблему, переписав свой код, чтобы он не использовал FOR XML. Спасибо за ответ. Я попробую в следующий раз, когда захочу преобразовать строки SQL в XML. - person Vivian River; 28.02.2014