【问题标题】:Why this query uses two table scans?为什么这个查询使用两个表扫描?
【发布时间】:2015-08-12 15:06:23
【问题描述】:

我在 SQL Server 2008 R2 上有这个简单的查询:

SELECT Art.ID_Articulo, 
       conv.Factor AS PesoToneladas 
FROM   dbo.Articulos Art 
       LEFT JOIN dbo.Conversiones conv 
              ON conv.ID_Articulo = Art.ID_Articulo 
                 AND conv.ID_Unidad1 = Art.ID_Unidad 

Articulos 分别由ID_ArticuloID_Unidad 索引。 表Conversiones 分别由ID_ArticuloID_Unidad1 索引。

执行计划显示两个表的表扫描会占用大量资源。

我怎样才能找到原因?

【问题讨论】:

  • 您在加入的列上有索引?
  • 我们需要查看两个表的脚本(包括索引)。
  • 据我所知,如果要检索的数据量非常大,优化器也会选择执行表扫描而不是索引查找(即使该列上有索引) (因为对数据的一次“批量”访问比单独检索每一行要快)。所以,这取决于查询应该返回的数据量..
  • 你的桌子有多大?
  • 查询优化器很可能已经发现您将读取两个表的所有行,这是由于您在此处构建外键和连接的方式,因此对每个表进行表扫描是最好的方法。它可能会建立一个哈希连接或类似的东西。

标签: sql-server database-optimization


【解决方案1】:

您的查询中没有过滤器,考虑到这一点,您将聚合整个 2 个表。使用索引 sql 可能需要在查找上花费更多资源。所以进行表扫描可能更便宜。

如果您将使用过滤器来减少数据,sql 可能会决定更改计划。

【讨论】:

  • 可以,但是如果他不想在查询中添加 更多 个过滤器(除了他已经在 J​​OIN 中拥有的过滤器)怎么办?
  • 那么 2 次扫描可能是查询的最佳解决方案。这可能是最快/资源较少的计划。您可以使用索引中的包含列来加快速度……但这是浪费磁盘空间,没有人能保证更快的响应。
  • 完全同意,我对这个问题发表了类似的评论。
  • 谢谢。这个查询是一个更复杂的查询的一部分,我认为表扫描是问题所在,但正如你提到的,如果我选择整个表,可能使用表扫描是最好的解决方案。问题出在其他地方。再次感谢。
  • @ercpap 查看 this article here 以了解更多使用什么/何时使用表扫描以及在您的场景中使用它的原因。
猜你喜欢
  • 2014-08-21
  • 2021-01-31
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多