【发布时间】:2009-09-25 14:02:53
【问题描述】:
我有一个存储过程,它根据 DATEADD 函数的结果进行过滤 - 我的理解是,这类似于使用用户定义的函数,因为 SQL 服务器无法根据它所拥有的函数的输出存储统计信息难以评估执行计划的成本。
查询看起来有点像这样:
SELECT /* Columns */ FROM
TableA JOIN TableB
ON TableA.id = TableB.join_id
WHERE DATEADD(hour, TableB.HoursDifferent, TableA.StartDate) <= @Now
(因此无法预先计算DATEADD 的结果)
我看到的是一个可怕的执行计划,我认为这是由于 SQL 服务器错误地估计从树的一部分返回的行数为 1,而实际上它约为 65,000。然而,当数据库中存在不同(不一定更少)数据时,我看到相同的存储过程在很短的时间内执行。
我的问题是 - 在这种情况下,查询优化器如何估计函数的结果?
更新:仅供参考,我更感兴趣的是了解为什么有时我会得到一个好的执行计划,而为什么其他时间却没有 - 我已经有了一个很好的执行计划从长远来看,我将如何解决这个问题。
【问题讨论】:
-
DATEADD 不是用户定义的函数。内置系统函数的处理方式通常与用户定义的函数不同。
标签: sql-server sql-server-2005 user-defined-functions sql-execution-plan