提高外部应用的性能

时间:2013-08-25 08:07:21

标签: sql tsql query-performance

让我简要描述我正在尝试的事情,以防有人有更优雅的方法来解决同样的问题。我正在尝试编写一个存储过程来查看数据库中的销售订单,查找同一客户多次订购同一项目的时间,并使用订单之间的先前间隔的平均值来预测订单的下一个日期同一个项目。下面的查询将构成临时表与可能的游标和运行平均值一起工作的基础。

到目前为止,我的查询看起来像这样

SELECT    sl.custaccount ,
        sl.itemid ,
        sl.shippingdaterequested ,
        nextdate.shippingdaterequested AS nextshippingdaterequested
FROM      salesline AS sl
        OUTER APPLY ( SELECT TOP 1
                                sl2.custaccount ,
                                sl2.itemid ,
                                sl2.shippingdaterequested
                      FROM      salesline AS sl2
                      WHERE     sl2.shippingdaterequested > sl.shippingdaterequested
                                AND sl2.custaccount = sl.custaccount
                                AND sl2.itemid = sl.itemid
                      GROUP BY  sl2.custaccount ,
                                sl2.itemid ,
                                sl2.shippingdaterequested
                      ORDER BY  sl2.shippingdaterequested
                    ) AS nextdate
GROUP BY  sl.custaccount ,
        sl.itemid ,
        sl.shippingdaterequested ,
        nextdate.shippingdaterequested

此查询为每个销售行提供一行,其中一列表示该客户下次订购该商品的时间。如果该列为NULL,我知道我所在的记录是最后一次。

基本问题是这个查询太慢了,如果我一次只针对一个客户,并且在一秒内返回结果,它运行正常,但是针对~100,000个客户运行大约需要27个小时。

我知道基本的问题是我在外部应用,所以它可能通过痛苦的行处理来排队,但我不确定另一种方式来听到它会更快地运行。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为你使它变得比它需要的更复杂 只需取最小值和最大值并除以计数

SELECT  sl.custaccount ,
    sl.itemid ,
    MAX(sl.shippingdaterequested) AS lastShip ,
    DATEDIFF(dd, MIN(sl.shippingdaterequested),
             MAX(sl.shippingdaterequested)) / COUNT(*) AS interval ,
    DATEADD(dd,
            DATEDIFF(dd, MIN(sl.shippingdaterequested),
                     MAX(sl.shippingdaterequested)) / COUNT(*),
            MAX(sl.shippingdaterequested)) AS nextShip
FROM    salesline AS sl
GROUP BY sl.custaccount ,
    sl.itemid
HAVING  COUNT(*) > 1