Ich habe eine Records
Tabelle mit über 100 Spalten und sehr vielen Zeilen und einen nicht gruppierten Index für 5 Felder basierend auf meinen Zugriffspfaden:
CREATE NONCLUSTERED INDEX [IX_Records_CustomerID]
ON [dbo].[Records] (
[CustomerID] ASC, -- int
[IsInvalid] ASC, -- int
[IsProcessed] ASC, -- bit
[IsRejected] ASC, -- bit
[RecordName] ASC, -- varchar(12)
;
Die 5 Felder enthalten nicht den Primärschlüssel RecordID
, der die Spalte im Clustered-Index darstellt.
Hier ist meine schlecht funktionierende Abfrage:
SELECT * FROM Records WHERE CustomerID IN (181, 283, 505)
Der Ausführungsplan zeigt, dass er einen Clustered Index Scan durchführt. Ich verstehe, dass ich Spalten auswähle, die nicht im Index enthalten sind. In Management Studio ändere ich die Abfrage in:
SELECT CustomerID, IsInvalid, IsProcessed, IsRejected, RecordName FROM Records
WHERE CustomerID IN (181, 283, 505)
Der Ausführungsplan zeigt eine Indexsuche an, und die Ausführungszeit für Abfragen sinkt von 44 Sekunden auf 2 Sekunden. Es fehlt mir jedoch die Freiheit in der Anwendung, die *
nur durch die Spalten zu ersetzen, die ich benötige und in meinen Index aufgenommen habe.
Gibt es einen Weg um den Clustered-Index-Scan herum, wenn ich gesperrt bin SELECT *
?
IN (…)
Unterabfrage?
SELECT * FROM that_view WHERE CustomerID IN (...);
?