Filtertabelle je nach Variable und Index verwenden

Ich filme einen Tisch, je nachdem, ob eine Variable gesetzt ist oder nicht. Aber der gruppierte Index wird nicht verwendet. Ist es möglich, die Abfrage zu bekommen, um den Index irgendwie zu benutzen. (Ich kann die Abfrage in diesem Fall nicht dynamisch erstellen)

DECLARE @UseFilter as bit = 1 select pkEventId from EventEvent where pkEventID = 57637 or @UseFilter = 0 

Ausführungsplan (nicht mit Index)
Bildbeschreibung hier eingeben

Wenn ich das überspringe, wird der Index verwendet.

 select pkEventId from EventEvent where pkEventID = 57637 

Ausführungsplan (mit Index)
Bildbeschreibung hier eingeben

Optimieren or ist hart, wie Ihr Beispiel zeigt. Eine Möglichkeit um diese ist die Verwendung von dynamischen SQL. Sie können auch versuchen:

 DECLARE @UseFilter as bit = 1 select pkEventId from EventEvent where pkEventID = 57637 UNION ALL select pkEventId from EventEvent where pkEventID <> 57637 AND @UseFilter = 0; 

Es ist möglich, dass die zweite Unterabfrage wegen des Vergleichs der Konstanten kurzgeschlossen wird.

BEARBEITEN:

Diese Version kann tun, was Sie wirklich wollen:

 select pkEventId from EventEvent where pkEventID = 57637 AND @UseFilter = 1 UNION ALL select pkEventId from EventEvent where @UseFilter = 0; 

Bildbeschreibung hier eingeben

Wie Sie sehen können, ist mein Index-Scan Clustered !

Hier ist mein Table_1 Skript erstellen:

 CREATE TABLE [dbo].[Table_1]( [col1] [bigint] IDENTITY(1,1) NOT NULL, [col2] [varchar](50) NULL, [col3] [nvarchar](max) NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [col1] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]