You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何针对uniqueidentifier列的WHERE IN查询会产生范围查找(大于/小于)?

关于SQL Server对UniqueIdentifier列IN查询生成范围查找执行计划的疑问

简化后的查询语句

SELECT *
FROM ParticipantTable p
WHERE p.OrganizationId = @p__linq__0
  AND p.ParticipantId IN (
    @p__linq__1,
    @p__linq__2,
    @p__linq__3,
    @p__linq__4,
    @p__linq__5,
    @p__linq__6,
    @p__linq__7,
    @p__linq__8,
    @p__linq__9,
    @p__linq__10
)

执行计划异常情况

该查询生成的执行计划(截取核心部分)显示,聚集索引查找采用了大于/小于的范围比较,而非针对每个输入值的常规等值查找:

Seek Keys[1]: Prefix: [snip].OrganizationId = Scalar Operator([@p__linq__0]); Start: [snip].ParticipantId > Scalar Operator([Expr1031]); End: [snip].ParticipantId < Scalar Operator([Expr1032])

疑问点

  • 针对uniqueidentifier类型列做范围查找,难道不会因为UUID无序的特性导致效率极低,甚至选中大量无关数据吗?循环遍历输入值逐个做等值查找,或者直接将10个值传入查找操作,难道不是更高效的选择?
  • 我猜测这可能是SQL Server针对参与人数较少的组织做的优化,但直接按值做等值查找难道不是更合理的处理方式?

强制等值查找的需求

出于学术研究目的,是否有办法强制SQL Server针对该查询使用等值查找而非范围查找?目前尝试过以下方法均无效:

  • 使用WITH (FORCESEEK([snip](OrganizationId, ParticipantId))),执行计划仍显示范围查找
  • 添加OPTIMIZE FOR UNKNOWN选项,结果没有变化

内容的提问来源于stack exchange,提问作者Fabian Schmied

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:52:11