根据变量和使用索引过滤表

时间:2015-04-15 11:36:19

标签: sql sql-server sql-server-2008 tsql

我根据是否设置了变量来过滤表格。但是没有使用聚集索引。是否有可能让查询以某种方式使用索引。 (在这种情况下,我无法动态创建查询)

DECLARE @UseFilter as bit = 1

select pkEventId from EventEvent
where pkEventID = 57637 or @UseFilter = 0

执行计划(不使用索引)
enter image description here

如果我跳过Or,则使用索引。

select pkEventId from EventEvent
where pkEventID = 57637

执行计划(使用索引)
enter image description here

2 个答案:

答案 0 :(得分:1)

正如您的示例所示,优化or很难。解决此问题的一种方法是使用动态SQL。你也可以试试这个:

DECLARE @UseFilter as bit = 1

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

由于常数的比较,第二个子查询可能会短路。

编辑:

这个版本可能会做你真正想要的:

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

答案 1 :(得分:0)

enter image description here

正如您所见,我的索引扫描是Clustered

这是我的Table_1创建脚本:

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]