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 に答える