我们在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模式应用于列会产生显着的差异吗?
答案 0 :(得分: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