【发布时间】:2009-09-25 11:13:38
【问题描述】:
我正在尝试调试一个相当复杂的存储过程,它连接了许多表 (10-11)。我看到对于树的一部分,估计的行数与实际的行数有很大的不同——在最坏的情况下,SQL 服务器估计将返回 1 行,而实际上返回了 55,000 行!
我正在尝试找出原因 - 我的所有统计信息都是最新的,并且我已经使用 FULLSCAN 更新了几个表格上的统计信息。我没有使用任何用户定义的函数或表变量。据我所见,SQL Server 应该能够准确估计将要返回多少行,但它会继续选择一个计划来执行数万次 RDI 查找(当它预计只执行 1或 2)。
我可以做些什么来尝试理解为什么估计的行数超出了这么多?
更新:因此,查看计划时,我发现了一个特别可疑的节点 - 它使用以下 predecate 对表进行表扫描:
status <> 5
AND [type] = 1
OR [type] = 2
这个谓词返回整个表(630 行 - 表扫描本身不是性能不佳的根源)但是 SQL 服务器的估计行数只有 37。然后 SQL 服务器继续执行几个嵌套循环这将用于 RDI 查找、索引扫描和索引搜索。这会是我严重误判的根源吗?如何让它估计更合理的行数?
【问题讨论】:
-
能否请您发布您的表定义和完整的查询?
-
对不起,但不是真的 - 它太大了(250 行 sp + 10 个表)。
-
如果你的谓词完全一样(没有括号),那么你可能有逻辑问题。 AND 优先于 OR。应该是 [status] 5 AND (type = 1 OR type = 2)
标签: sql-server sql-server-2005 sql-execution-plan