Som Martin föreslog i en kommentar under frågan är problemet att SQL-servern inte trycker ner predikatet från WHERE-satsen ordentligt - se länken i hans kommentar.
Det slutade med att jag skapade en användardefinierad funktion med tabellvärde och använde den med operatorn CROSS APPLY för att skapa vyn.
Låt oss se själva lösningen.
Användardefinierad funktion med tabellvärde
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
)
Visa
CREATE VIEW [dbo].[TestView]
AS
SELECT t.Id, t.ParentId, f.Data, f.Depth
FROM
Test AS t
CROSS APPLY TestFunction(Id) as f
Fråga med konstant
SELECT * FROM TestView WHERE Id = 69
Fråga med parameter
DECLARE @Id INT
SELECT @Id = 69
SELECT * FROM TestView WHERE Id = @Id
Frågan med parmater körs i princip lika snabbt som frågan med konstanten.
Tack Martin och för de andra också!