如何解决表扫描如何返回比表中更多的行?
| 我对具有错误统计信息和零散索引的数据库进行了复杂的查询。我感到困惑的是,当我检查一个实际的查询计划时,从具有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运算符。
如果在表上放置了适当的索引以支持连接,则可能仅会查找单行,因此,将有较少的行发送回嵌套循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。