我根据是否设置了变量来过滤表格。但是没有使用聚集索引。是否有可能让查询以某种方式使用索引。 (在这种情况下,我无法动态创建查询)
DECLARE @UseFilter as bit = 1
select pkEventId from EventEvent
where pkEventID = 57637 or @UseFilter = 0
执行计划(不使用索引)
如果我跳过Or
,则使用索引。
select pkEventId from EventEvent
where pkEventID = 57637
执行计划(使用索引)
答案 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)
正如您所见,我的索引扫描是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]