我试图优化一些可怕的SQL查询,因为它花费了太长时间才能完成。

在查询中,我已经动态创建了具有许多相同功能的SQL语句,因此我创建了一个临时表,其中每个函数仅调用一次,而不是很多次,这将我的执行时间缩短了3/4。

因此,我的问题是,如果说1000个约会计算范围缩小到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 

在这些字符串(将其放在零件和零件中)然后执行的情况下,将它们动态生成,以便可以沿着每次迭代更改各种参数 - 主要是最后一行,其中包含各种日期的查询。

大约有420个疑问,可以像这样计算这些日期。我知道我可以轻松地将它们全部拉到临时表中(1,000个约会者变为50) - 但是值得吗,它会在几秒钟内有任何区别吗?我希望比十分秒的进步更好。

有帮助吗?

解决方案

诚实地说,这完全取决于您在做什么。

例如,如果您在某个子句中使用了日期夫(或实际上是任何其他功能),那么这将是性能较差的原因,因为它将阻止该列上使用索引。

例如,基本示例,查找2009年的所有记录

WHERE DATEDIFF(yyyy, DateColumn, '2009-01-01') = 0

不会在DateColumn上充分利用索引。而提供最佳索引使用的更好解决方案是:

WHERE DateColumn >= '2009-01-01' AND DateColumn < '2010-01-01'

最近博客 如果您有兴趣,这会带来的区别(与性能统计/执行计划比较)。

这将比在结果集中返回日期为专栏要昂贵。

我将首先确定所花费最多时间的单个查询。检查执行计划,以查看问题所在的位置并从那里调整。

编辑:根据您给出的示例查询,这是一种方法,您可以尝试删除Whewhere子句中使用日期的使用。在给定日期找到每个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日至2010年12月1日至1月1日的年龄1岁)。

希望这可以帮助。

其他提示

与其他处理日期时间值(如字符串)处理的方法相比,约会夫非常有效。 ((看到这个答案).

在这种情况下,听起来您要浏览相同的数据,这可能比使用临时表更昂贵。例如,将生成统计信息。

您可能能够做的一件事可能是在中间的温度表上放置索引。

检查您的执行计划以查看是否有帮助(可能取决于临时表中的行数)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top