这个问题有点类似之前的一个问题:
其中一个查询会根据where子句而极其缓慢地运行。我使用了CTE重写了该查询,并成功避免了这个问题,但始终没有找到答案。
最近调整了另一个类似的查询以添加另一个字段,结果性能从大约30秒运行并返回10,000行下降到需要超过10小时(最终返回相同的结果集)。今天我开始排除这个问题,发现了一些奇怪的东西。
我不断地需要从日期时间值中提取仅日期部分,因此我将逻辑编写成了一个函数:
CREATE FUNCTION [dbo].[cDate] ( @pInputDate DATETIME )
RETURNS DATETIME
BEGIN
RETURN CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)
END
GO
我发现在这个新的低效查询中,如果我用
CAST(CONVERT(VARCHAR(10), @pInputDate, 111) AS DATETIME)
替换那个函数,查询的执行速度从大约10个小时降至不到2秒。我在预计的执行计划中看不出任何区别。顺便说一句,这不是新增字段。我想添加其他字段可能会改变执行计划并放大上述条件。
我的问题是,这是正常的吗?像上面那样,我会使用函数来处理重复的过程,因为它们更容易维护、记忆和更新,如果您找到了更有效的方法来完成某些操作。我应该对我的函数做些什么以提高它们的性能吗?
CAST(@pInputDate AS DATE)
会更有效率(适用于 2008 或更新版本)... - marc_s