Martinが質問の下のコメントで示唆したように、問題はSQLサーバーがWHERE句から述語を適切にプッシュダウンしないことです-彼のコメントのリンクを参照してください。
最終的に、ユーザー定義のテーブル値関数を作成し、それをCROSSAPPLY演算子とともに使用してビューを作成しました。
ソリューション自体を見てみましょう。
ユーザー定義のテーブル値関数
CREATE FUNCTION [dbo].[TestFunction] (@Id INT)
RETURNS TABLE
AS
RETURN
(
WITH
Hierarchy (Id, ParentId, Data, Depth)
AS(
SELECT Id, ParentId, NULL AS Data, 0 AS Depth FROM Test Where Id = @Id
UNION ALL
SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
FROM Hierarchy h
INNER JOIN Test t ON t.Id = h.ParentId
)
SELECT * FROM Hierarchy
)
表示
CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
Test AS t
CROSS APPLY TestFunction(Id) as f
定数を使用したクエリ
SELECT * FROM TestView WHERE Id = 69
パラメータを使用したクエリ
DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id
パラメーターを使用したクエリは、基本的に定数を使用したクエリと同じ速度で実行されます。
マーティンと他の人にも感謝します!