有没有办法用范围谓词来阻止索引搜索?

时间:2016-06-24 19:18:11

标签: sql sql-server indexing

SQL Server 2008 R2

我正在加入两个巨大的表..查询看起来像:

SELECT ...
FROM Parent p
INNER JOIN Child c ON c.ID = p.ID
<further joins>
WHERE p.ID IN (9558207665, 9558213992, 9558245267, 9558291779, 9558403049)

两个表都有ID上的聚簇索引。

查询计划正在创建一个Clustered Index Seek(在子表上,有趣的是),但是正在使用从9558207665到9558403049的范围谓词。这会导致读取400,000多条记录,因为子表有多个记录给定的ID。这引起了一个问题,特别是当我指定了我想要的实际5个ID时。

我能够做到这一点的唯一方法是创建一个包含5个ID的表变量,并将其用作初始FROM表,并链接到它。

我理解,由于某种原因,统计数据表明范围会比单个查找更快,但由于这最终是错误的选择,是否有其他方法可以强制搜索进行单独查找?

1 个答案:

答案 0 :(得分:1)

在处理大型表时,使用较小的相关范围连接,有时需要添加看似冗余的过滤器。

SELECT ...
FROM Parent p
INNER JOIN Child c ON c.ID = p.ID
<further joins>
WHERE p.ID IN (9558207665, 9558213992, 9558245267, 9558291779, 9558403049)
AND c.ID IN (9558207665, 9558213992, 9558245267, 9558291779, 9558403049)