【发布时间】:2012-11-20 14:15:58
【问题描述】:
这是上一个问题的延续:
SQL Server Query time out depending on Where Clause
根据 where 子句,查询运行速度会非常缓慢。我使用 CTE 重写了该查询并很好地避免了该问题,但从未找到答案。
最近对另一个类似的查询进行了调整以添加另一个字段,但它的性能突然从运行并返回 10,000 行的大约 30 秒下降到需要 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 秒。我看不出估计的执行计划有什么不同。顺便说一句,这不是添加的字段。我假设添加另一个字段会以某种方式导致执行计划发生变化并放大上述情况。
我的问题是,这正常吗?如上所述,我将函数用于重复过程,因为如果你找到一种更有效的做事方式,它们更容易维护、记忆和更新。我应该对我的函数做些什么来提高它们的性能吗?
【问题讨论】:
-
是的,众所周知。搜索标量值函数。这是 RBAR...
-
您使用的是什么版本的 SQL Server?也许
CAST(@pInputDate AS DATE)会更有效率(这将适用于 2008 或更新版本)... -
不幸的是,我现在被困在 2005 年,所以这不是一个选择。
-
谢谢米奇。看起来我有一些重新设计要做...
标签: sql sql-server performance tsql sql-function