需要优化SQL查询

时间:2014-02-12 03:50:14

标签: sql

这是SQL的where子句。当我删除这部分时,它需要3分钟来执行,这个需要超过15分钟 DB

中有近9000条记录
WHERE username = 'xyz' AND 
( 
    ( acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29' ) 
    OR 
    ( 
        YEAR(acceptedfordeliverytime) = YEAR('2013-1-29') 
        AND 
        MONTH(acceptedfordeliverytime) = MONTH('2013-1-29') 
        AND 
        DAY(acceptedfordeliverytime) = DAY('2013-1-29')
    ) 
    OR 
    ( 
        YEAR(acceptedfordeliverytime) = YEAR('2012-9-1') 
        AND 
        MONTH(acceptedfordeliverytime) = MONTH('2012-9-1') 
        AND 
        DAY(acceptedfordeliverytime) = DAY('2012-9-1') 
    )
)

4 个答案:

答案 0 :(得分:2)

为什么不使用:

WHERE username = 'xyz' AND 
      (acceptedfordeliverytime >= '2012-09-01' AND 
       acceptedfordeliverytime < '2013-01-30'
      ) 

这也将允许在执行查询时使用(username, acceptedfordeliverytime)上的索引。

答案 1 :(得分:0)

我认为这会给你相同的结果。 并且还可以为已接受列的列创建索引,以加快搜索速度。

WHERE username = 'xyz' AND acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29'

答案 2 :(得分:0)

不包含BETWEEN吗?这意味着您不需要所有额外的条款(以非常精细的方式检查第一个和最后一个日期)。我相信你的查询会返回相同的结果:

WHERE username = 'xyz' AND 
( 
    acceptedfordeliverytime BETWEEN '2012-9-1' AND '2013-1-29'
)

答案 3 :(得分:0)

你的两个OR部分都是不必要的。

使用时

acceptedfordeliverytime  Between '2012-9-1' AND '2013-1-29'

它使用了两个日期,因此不需要部分。如果您的数据库中有日期和时间,那么您可以将其转换为日期,如此

CAST(acceptedfordeliverytime as date)  Between '2012-9-1' AND '2013-1-29'