Ich habe eine Ansicht, die 2 Ints aus einer Tabelle mit einem CTE zurückgibt. Wenn ich die Ansicht wie diese Abfrage läuft es in weniger als einer SekundeSQL Server-Abfrage: Schnell mit Literal, aber langsam mit Variable
SELECT * FROM view1 WHERE ID = 1
Allerdings, wenn ich die Ansicht wie diese Abfrage dauert es 4 Sekunden.
DECLARE @id INT = 1
SELECT * FROM View1 WHERE ID = @id
Ich habe die 2 Abfragepläne überprüft und die erste Abfrage wird ein Clustered-Index suchen auf der Haupttabelle Durchführung der Rückkehr 1 Datensatz dann den Rest der Ansicht Abfrage auf diese Ergebnismenge Anwendung, wo als die zweite Abfrage führt einen Index-Scan durch, der ungefähr 3000 Datensätze zurückgibt, anstatt nur den einen, an dem ich interessiert bin, und später den Ergebnissatz zu filtern.
Gibt es etwas Offensichtliches, dass ich vermisse, um zu versuchen, die zweite Abfrage den Index Seek anstelle eines Index-Scan zu verwenden. Ich benutze SQL 2008, aber alles, was ich tue, muss auch auf SQL 2005 laufen. Zuerst dachte ich, es wäre ein Problem mit dem Parameter-Sniffing, aber ich bekomme die gleichen Ergebnisse, selbst wenn ich den Cache lösche.
Welcher Datentyp ist ID? – gbn
es ist ein INT-Feld – Gavin