我有一个存储过程,根据DATEADD
函数的结果进行过滤 - 我的理解是,这与使用用户定义的函数类似,因为SQL服务器无法存储基于该函数输出的统计信息,因此无法评估执行计划的成本。SQL Server如何评估包含用户定义函数的执行计划的成本?
查询看起来有点像这样:
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不是用户定义的函数。内置的系统功能通常与用户定义的功能不同。 – GilaMonster 2009-09-25 14:44:43