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

Sql server 表扫描如何返回比表中更多的行?,sql-server,sql-execution-plan,Sql Server,Sql Execution Plan,我对一个数据库有一个复杂的查询,其中包含糟糕的统计数据和零碎的索引。让我感到困惑的是,当我检查一个实际的查询计划时,我从一个有23k行的表上的表扫描中得到了54m行。在查询计划的更上一层,这个表是针对自身连接的(23k行中只有260k行)。这怎么可能 运行一些其他的查询或重建索引和统计数据可以消除这种情况,我只是想理解为什么会发生这种情况 我用SQL 2005和SQL 2008 R2在同一数据库的还原上复制了这一点 更新:是的,这是一个实际的计划。行数为20039(不是上面提到的23K)。这是最

我对一个数据库有一个复杂的查询,其中包含糟糕的统计数据和零碎的索引。让我感到困惑的是,当我检查一个实际的查询计划时,我从一个有23k行的表上的表扫描中得到了54m行。在查询计划的更上一层,这个表是针对自身连接的(23k行中只有260k行)。这怎么可能

运行一些其他的查询或重建索引和统计数据可以消除这种情况,我只是想理解为什么会发生这种情况

我用SQL 2005和SQL 2008 R2在同一数据库的还原上复制了这一点

更新:是的,这是一个实际的计划。行数为20039(不是上面提到的23K)。这是最右边的节点之一


执行计划中的此节点似乎是嵌套循环联接中涉及的“第二个”表,“第一个”表中有2701行(谢谢Martin!)

由于HistoricalPrice表上似乎没有适当的索引,因此必须针对循环联接中的每一行扫描堆,结果总共有2701*20039=54125339行。嵌套循环运算符中的行数将是连接/匹配行的总数

虽然执行计划仅显示作为一个节点访问的表,但循环联接最终访问该表的次数与访问行的次数相同。如果没有索引,则必须扫描整个表,每次都会将20039行返回给嵌套循环运算符


如果在表上放置了适当的索引以支持联接,那么可能只会查找一行,因此发送回嵌套循环的行数较少。

Hmmm。。。该表是否被扫描多次?出于充分的理由,该表在查询中是自联接的。在查询计划中,它被扫描了两次(上面提到的表扫描),并且在表上也进行了三次索引查找。这是估计执行计划还是实际执行计划?是-实际计划,附加了一个图像。@Pavel-有意思的是2701*20039给出了正确的数字。确定它没有被执行2701次吗?它是在连接的内侧还是什么的?是的,在树的后面有一个嵌套循环,另一侧请求2701行。