次の(簡略化された)CTEを試しています。テーブル変数 () を使用すると、クエリをキャンセルする前に数分間クエリが実行されます。他のコメントアウトされたメソッドはいずれも、1 秒以内に戻ります。
WHERE 句全体を INNER JOIN に置き換えると、同様に高速になります。
テーブル変数を使用すると実行速度が非常に遅くなる理由はありますか?
FWIW: データベースには 250 万のレコードが含まれており、内部クエリは 2 つのレコードを返します。
CREATE TABLE #rootTempTable (RootID int PRIMARY KEY)
INSERT INTO #rootTempTable VALUES (1360);
DECLARE @rootTableVar TABLE (RootID int PRIMARY KEY);
INSERT INTO @rootTableVar VALUES (1360);
WITH My_CTE AS
(
SELECT ROW_NUMBER() OVER(ORDER BY d.DocumentID) rownum, d.DocumentID, d.Title
FROM [Document] d
WHERE d.LocationID IN
(
SELECT LocationID
FROM Location
JOIN @rootTableVar rtv ON Location.RootID = rtv.RootID -- VERY SLOW!
--JOIN #rootTempTable tt ON Location.RootID = tt.RootID -- Fast
--JOIN (SELECT 1360 as RootID) AS rt ON Location.RootID = rt.RootID -- Fast
--WHERE RootID = 1360 -- Fast
)
)
SELECT * FROM My_CTE WHERE (rownum > 0) AND (rownum <= 100) ORDER BY rownum
これは、テーブル変数を使用する場合からのものです。クエリの実行には 17 分以上かかりました。
XML 形式の実行計画
一時テーブル: https://docs.google.com/open?id=0B66I-fxlyEtEZEthV3ZaWlNLWXM
テーブル変数: https://docs.google.com/open?id=0B66I-fxlyEtEbUFZa3RJejFCTkk