【问题标题】:DATEADD conditon take long time in SQL Server 2008 .Why?DATEADD 条件在 SQL Server 2008 中需要很长时间。为什么?
【发布时间】:2015-11-21 16:01:17
【问题描述】:

我想在我的销售表中获取上个月和当前月份之间的数据。我使用dateadd 函数来获取月份。但是查询需要很长时间才能返回结果。当我删除 where 子句中的日期范围时,执行时间非常快。如何在查询中添加月份的日期范围以加快执行时间?

这是我的问题。

select *
from sales S
where S.DOCUMENT_DATE >= DATEADD(m, DATEDIFF(m, 0, GETDATE())-1 , 0) and  
      S.DOCUMENT_DATE <= DATEADD(m, DATEDIFF(m, 0, GETDATE())+1 , -1)   

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    根据您的查询,您希望在sales(document_date) 上建立索引。

    【讨论】:

    • @Gordon Linoff ,对长执行时间没有影响,仍然需要很长时间
    • @dragullar 。 . .这可能是由于返回的数据量很大。但是,一个月的速度不应该比所有月份都慢。另一种可能性是在document_date 上创建一个聚集 索引。也许问题是第一行的时间,所以似乎返回所有数据更快。
    【解决方案2】:

    您可以创建一个非聚集索引。

    CREATE NONCLUSTERED INDEX NC_IX_Sales_DOCUMENT_DATE ON Sales (DOCUMENT_DATE)
    

    然后你就可以运行你的查询了。

    SELECT *
    FROM Sales s
    WHERE s.DOCUMENT_DATE >= DATEADD(mm,DATEDIFF(mm,0,DATEADD(mm,-1,GETDATE())),0)
      AND s.DOCUMENT_DATE <= DATEADD(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1, 0))
    

    您还可以考虑当前月份尚未结束。

    SELECT *
    FROM Sales s
    WHERE s.DOCUMENT_DATE >= DATEADD(month,DATEDIFF(month,0,DATEADD(month,-1,GETDATE())),0)
      AND s.DOCUMENT_DATE <= GETDATE()
    

    【讨论】:

    • 如果您的查询在现实生活中如此简单,那么毫无疑问会在日期列上创建索引。不要忘记删除 *,并提及列名。其次,您可以使用两个变量,例如“@FromDate " 和 "@Todate"。并比较性能。别忘了分享你的经验。
    • @JCA ,对执行时间长没有影响,仍然需要很长时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多