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表,并链接到它。
我理解,由于某种原因,统计数据表明范围会比单个查找更快,但由于这最终是错误的选择,是否有其他方法可以强制搜索进行单独查找?
答案 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)