gpt4 book ai didi

sql - 使用函数的 SQL Server 查询速度非常慢

转载 作者:行者123 更新时间:2023-12-04 16:05:23 26 4
gpt4 key购买 nike

这种继承自上一个问题:

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 秒。我看不出估计的执行计划有什么不同。顺便说一下,这不是添加的字段。我假设添加另一个字段以某种方式导致执行计划改变并放大上述条件。

我的问题是,这正常吗?我将函数用于重复过程,如上所述,因为如果您找到更有效的做某事的方法,它们更易于维护、内存和更新。我应该对我的功能做些什么来提高它们的性能吗?

最佳答案

如果您必须将其封装在函数中,请参阅 Scalar functions, inlining, and performance: An entertaining title for a boring post

改写如下

CREATE FUNCTION dbo.cDate_Inline
(
@pInputDate DATETIME
)
RETURNS TABLE
AS
RETURN
(
SELECT DATEADD(day, DATEDIFF(Day, 0, @pInputDate), 0) AS [Date]
)

然后代替
SELECT *,
[dbo].[cDate](modify_date) AS modified
FROM sys.objects


SELECT *,
ca.Date AS modified
FROM sys.objects
CROSS APPLY dbo.cDate_Inline(modify_date) ca

这将由查询优化器内联到计划中。

关于sql - 使用函数的 SQL Server 查询速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13677755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com