表扫描如何返回比表中更多的行?

| 我对具有错误统计信息和零散索引的数据库进行了复杂的查询。我感到困惑的是,当我检查一个实际的查询计划时,从具有23 K行的表的表扫描中得到了54 M行。在查询计划的更远处,此表已针对自身进行联接(23 K中仅260 K行)。这怎么可能? 运行其他查询或重建索引和统计信息可以消除这种情况,我只是想了解为什么会发生这种情况。 我已经在还原相同数据库的情况下使用SQL 2005和SQL 2008 R2复制了此内容。 更新:是的,这是一个实际的计划。行数是20039(不是如上所述的23 K)。这是最右边的节点之一。     
已邀请:
看来执行计划中的该节点是嵌套循环连接中涉及的“ second”表,“ first”表中有2701行(感谢Martin!)。 由于HistoricalPrice表上似乎没有适当的索引,因此必须对堆连接中的每一行进行扫描,从而导致总数为2701 * 20039 = 54,125,339行。从嵌套循环运算符出来的行数将是联接/匹配的行的总数。 虽然执行计划仅显示将表作为一个节点进行访问,但循环联接最终将访问该表的次数与行数相同。如果没有索引,则必须扫描整个表,每次都会将20,039行返回给Nested Loop运算符。 如果在表上放置了适当的索引以支持连接,则可能仅会查找单行,因此,将有较少的行发送回嵌套循环。     

要回复问题请先登录注册