我有一个聚集索引主键列,我正在对它进行范围查询。问题是扫描仅使用第一个范围部分作为搜索谓词,而将范围的另一侧作为剩余谓词。这导致读取所有行直到@upper 限制
我正在为范围使用两个参数:
declare
@lower numeric(18,0) = 1000,
@upper numeric(18,0) = 1005;
select * from messages
where msg_id between @lower+1 and @upper;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,实际执行计划显示:
表定义(简化):
CREATE TABLE [dbo].[messages](
[msg_id] [numeric](18, 0) IDENTITY(0,1) NOT NULL,
[col2] [varchar](32) NOT NULL,
CONSTRAINT [PK_Message] PRIMARY KEY CLUSTERED
(
[msg_id] ASC
)
Run Code Online (Sandbox Code Playgroud)
更多信息
当与常量而不是变量一起使用时,两个谓词都是 'Seek' 尝试过Option (Optimize for (@lower=1000))
,但没有成功