这种继承自上一个问题:
根据 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 秒。我看不出估计的执行计划有什么不同。顺便说一句,这不是添加的字段。我假设添加另一个字段以某种方式导致执行计划发生变化并放大了上述情况。
我的问题是,这正常吗?如上所述,我将函数用于重复过程,因为如果你找到一种更有效的做事方式,它们更容易维护、记忆和更新。我应该对我的功能做些什么来提高它们的性能吗?