使用范围谓词停止索引查找的任何方法



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表,链接到它。

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

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

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)

相关内容

最新更新