1

我们在 SQL Server 2008 R2 数据库的几个表中使用 XML 列和传统列,其结构如下:

<bridging>
  <project id="43" source="true" />
  <project id="48" source="false" />
  <project id="99" source="false" />
  <project id="123" source="false" />
</bridging>

然后,我们在 WHERE 子句中使用带有 .exist XPath 查询的存储过程从这些表中选择数据,如下所示:

SELECT  
    e.ID, 
    e.ProjectsBridge,
    e.Quantity, 
    e.Rate, 
    e.UOMID, 
    u.Name as UOM
FROM    
    tblEstimator e LEFT OUTER JOIN
    tblUnitOfMeasure u ON u.ID = e.UOMID
WHERE   
    (e.ProjectsBridge.exist('//bridging/project/@id[. = sql:variable("@ProjectID")]') = 1 OR 
     @ProjectID IS NULL) 

这在较小的数据集上效果很好,但数据集越大,速度越慢 - 上面的示例在一百万条记录的数据集上运行超过 2 分钟。

所以问题是是否有更好、更快的方法来做这个查询?

将 XML 模式应用于列会产生显着差异吗?

4

1 回答 1

1

您可以尝试几件事:

在您的上下文中,CROSS APPLY 也可能更有效:

SELECT e.ID 
FROM tblEstimator e
CROSS APPLY e.ProjectsBridge.nodes('/bridging/project') AS T(c)
WHERE T.c.value('@id', 'INT') = @ProjectId
于 2012-04-09T22:01:45.403 回答