gpt4 book ai didi

sql - SQL DATEDIFF(year, ..., ...) 是一种昂贵的计算吗?

转载 作者:行者123 更新时间:2023-12-04 21:39:35 25 4
gpt4 key购买 nike

我正在尝试优化一些极其复杂的 SQL 查询,因为它需要很长时间才能完成。

在我的查询中,我动态创建了具有许多相同函数的 SQL 语句,因此我创建了一个临时表,其中每个函数只被调用一次,而不是多次调用 - 这将我的执行时间减少了 3/4。

所以我的问题是,如果说 1,000 个 datediff 计算缩小到 100,我能期望看到很大的不同吗?

编辑:
查询如下所示:

SELECT DISTINCT M.MID, M.RE FROM #TEMP INNER JOIN M ON #TEMP.MID=M.MID 
WHERE ( #TEMP.Property1=1 ) AND
DATEDIFF( year, M.DOB, @date2 ) >= 15 AND DATEDIFF( year, M.DOB, @date2 ) <= 17

这些是作为字符串动态生成的(以零碎的形式组合在一起)然后执行,以便可以在每次迭代中更改各种参数 - 主要是最后几行,包含各种 DATEDIFF 查询。

大约有 420 个这样的查询,这些日期差异是这样计算的。我知道我可以轻松地将它们全部放入临时表中(1,000 个 datediffs 变成 50 个)-但是值得吗,它会在几秒钟内产生任何不同吗?我希望有比十分之几秒更好的改进。

最佳答案

老实说,这取决于您在做什么,对性能的影响程度。
例如,如果您在 WHERE 子句中使用 DATEDIFF(或实际上任何其他函数),那么这将导致性能下降,因为它会阻止在该列上使用索引。
例如基本示例,查找 2009 年的所有记录

WHERE DATEDIFF(yyyy, DateColumn, '2009-01-01') = 0
不会很好地利用 DateColumn 上的索引。而提供最佳索引使用的更好解决方案是:
WHERE DateColumn >= '2009-01-01' AND DateColumn < '2010-01-01'
如果您有兴趣,我 recently blogged 关于这产生的差异(与性能统计/执行计划比较)。
这比将 DATEDIFF 作为结果集中的列返回的成本更高。
我将首先确定花费最多时间的单个查询。检查执行计划以查看问题所在并从那里进行调整。
编辑:
根据您提供的示例查询,这里有一种方法,您可以尝试在 WHERE 子句中删除 DATEDIFF 的使用。查找在给定日期 10 岁的每个人的基本示例 - 我认为数学是正确的,但无论如何你都明白了!给它一个快速测试,看起来不错。应该很容易适应您的场景。如果您想在给定日期查找(例如)15 到 17 岁之间的人,那么使用这种方法也是可能的。
-- Assuming @Date2 is set to the date at which you want to calculate someone's age 
DECLARE @AgeAtDate INTEGER
SET @AgeAtDate = 10

DECLARE @BornFrom DATETIME
DECLARE @BornUntil DATETIME
SELECT @BornFrom = DATEADD(yyyy, -(@AgeAtDate + 1), @Date2)
SELECT @BornUntil = DATEADD(yyyy, -@AgeAtDate , @Date2)

SELECT DOB
FROM YourTable
WHERE DOB > @BornFrom AND DOB <= @BornUntil
要补充的一个重要说明是,对于从 DOB 计算的年龄,这种方法更准确。您当前的实现只考虑了出生年份,而不是实际日期(例如,2009 年 12 月 1 日出生的人在 2010 年 1 月 1 日将显示为 1 岁,而他们直到 2010 年 12 月 1 日才为 1)。
希望这可以帮助。

关于sql - SQL DATEDIFF(year, ..., ...) 是一种昂贵的计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2547316/

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