小编Abi*_*lov的帖子

同一列上的聚集索引“Seek predicate”和“predicate”

我有一个聚集索引主键列,我正在对它进行范围查询。问题是扫描仅使用第一个范围部分作为搜索谓词,而将范围的另一侧作为剩余谓词。这导致读取所有行直到@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)

在这种情况下,实际执行计划显示:

  • 谓词:messages.msg_id >=lower
  • 寻求谓词:messages.msg_id < @upper
  • 读取的行数:1005

表定义(简化):

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)),但没有成功

index sql-server

8
推荐指数
1
解决办法
918
查看次数

标签 统计

index ×1

sql-server ×1