我在一个数据库上有一个复杂的查询,该数据库具有糟糕的统计数据和零碎的索引。令我困惑的是,当我检查一个实际的查询计划时,我从一个有23K行的表的表扫描中得到54M行。在查询计划的更高层次上,这个表是针对自身连接的(23K中只有260K行)。这怎麽可能?
运行一些其他查询或重建索引和统计数据可以消除这种情况,我只是想知道为什么会发生这种情况。
我在恢复同一数据库时使用SQL2005和SQL2008 R2重现了这一点。
更新:是的,这是一个实际的计划。行数是20039 (不是上面提到的23K)。这是最右边的节点之一。
发布于 2011-05-27 03:09:30
看起来执行计划中的这个节点是嵌套循环连接中的“第二个”表,“第一个”表中有2701行(谢谢Martin!)。
由于HistoricalPrice表上似乎没有适当的索引,因此必须为循环联接中的每一行扫描堆,结果总共有2701*20039 = 54,125,339行。从嵌套循环运算符输出的行数将是联接/匹配行的总数。
虽然执行计划只将被访问的表显示为一个节点,但循环连接最终将访问该表的行数。如果没有索引,则必须扫描整个表,每次扫描都会将20,039行返回给嵌套循环操作符。
如果在表上放置了适当的索引来支持连接,那么可能只会查找一行,因此发送回嵌套循环的行数会更少。
https://stackoverflow.com/questions/6144126
复制相似问题