【问题标题】:How to make my FOR XML SQL query faster?如何让我的 FOR XML SQL 查询更快?
【发布时间】:2014-02-24 21:45:10
【问题描述】:
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 中的所有行以及 View2 中相关行的 XML 表示,这正是我想要的。问题是这个查询需要四分钟才能执行。每个视图都有几千行。

当我使用 join 语句运行普通查询时,它只需 6 秒即可执行,但我正在寻找一种将结果序列化为 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 查询这么慢?

【问题讨论】:

  • 执行计划可能不同。 . .例如,for xml 查询可能正在使用嵌套循环连接。你能发布两个查询的执行计划吗?

标签: sql xml performance sqlxml


【解决方案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');

【讨论】:

  • +1:我已经通过重写我的代码以不使用FOR XML 解决了这个问题。感谢您的回答。下次我想将 SQL 行转换为 XML 时我会尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 2019-05-13
  • 1970-01-01
相关资源
最近更新 更多