为何针对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
相关产品推荐
相关产品推荐

