加快我的 SQL 查询速度?它给出了执行超时错误

Posted

技术标签:

【中文标题】加快我的 SQL 查询速度?它给出了执行超时错误【英文标题】:Speed up my SQL Query? It is giving execution time out error 【发布时间】:2020-02-14 06:03:39 【问题描述】:

我在下面创建了这个查询,它计算每个日期的总和。这个查询给了我正在寻找的确切结果,但它的数据非常大。如何加快或优化它?

IF OBJECT_ID('TEMPDB..#temp')IS NOT NULL 
DROP TABLE #temp
IF OBJECT_ID('TEMPDB..#temp1')IS NOT NULL 
DROP TABLE #temp1

Declare    @DateFrom DateTime
Set    @DateFrom = CONVERT(DATE,DATEADD(D,-datepart(d,getdate())+1,DATEADD(M,-1,GETDATE())))
Declare    @DateTo DateTime
Set    @DateTo = CONVERT(DATE,DATEADD(D,-DATEPART(D,getdate()),GETDATE())) 

Select 
Date
,[Item No_]
,case when Sum(ILE.Quantity)>0 and [Posting Date]=Date then Sum(ILE.Quantity) else 0 end AS [In Quantity],
case when Sum(ILE.Quantity)<0 and [Posting Date]=Date then Sum(ILE.Quantity) else 0 end AS [Out Quantity],
(Sum(ILE.Quantity))Closing
into #temp
 from Calender C left Join [Snowman Logistics Limited$Item Ledger Entry]ILE on Cast(ILE.[Posting Date]as date)<=C.Date 

Group by Date,[Item No_],[Posting Date]

Select  Date,[Item No_]
,SUm([In Quantity])[In Quantity],Sum([Out Quantity])[Out Quantity],Sum(Closing)Closing from #temp where Date Between @DateFrom and @DateFrom
group by  Date,[Item No_]

【问题讨论】:

尝试先使用窗口函数***.com/questions/860966/…获取运行总计,然后将结果与日历表连接。 【参考方案1】:

你可以试试:

    在您对匹配项感兴趣的第一个查询中 - 您可以尝试使用 INNER JOIN,如果您仍然需要 [dates]-[items],即使在 [Snowman Logistics Limited$Item Ledger Entry] 表中的指定时间段内没有它们的条目,您可以稍后; 为什么需要将 [Posting Date] 转换为日期 - 如果它是字符串而不是日期/日期时间类型,则应更改它以便在计算期间跳过显式(或隐式)转换 如果1没问题,你可以使用INNER JOIN,你可以尝试创建indexed view并预先计算初始查询

    在您的第一个查询中,您按[Posting Date] 对记录进行分组,而在第二个查询中,您再次对记录进行分组,不包括它 - 您不能合并查询吗?

    Select 
    Date
    ,[Item No_]
    ,case when Sum(ILE.Quantity)>0 and [Posting Date]=Date then Sum(ILE.Quantity) else 0 end AS [In Quantity],
    case when Sum(ILE.Quantity)<0 and [Posting Date]=Date then Sum(ILE.Quantity) else 0 end AS [Out Quantity],
    (Sum(ILE.Quantity))Closing
    into #temp
    from Calender C 
    left Join [Snowman Logistics Limited$Item Ledger Entry]ILE 
        on Cast(ILE.[Posting Date]as date) <= C.Date 
    where Date Between @DateFrom and @DateFrom
    Group by Date,[Item No_]
    
    1234563将读取更少的数据(更少的 IO)。

【讨论】:

以上是关于加快我的 SQL 查询速度?它给出了执行超时错误的主要内容,如果未能解决你的问题,请参考以下文章

如何加快我在 sql 中的查询

为啥使用 Take() 似乎加快了我的 EF 查询? [复制]

我可以做些啥来加快这个 SQL 查询的速度?

如何加快sql查询执行速度?

在 SQL 中合并 2 个查询

SQL 百分位数计算运行非常缓慢 - 需要帮助加快速度