在While循环中进行MySQL Update查询需要花费大量时间

时间:2014-05-26 11:26:56

标签: mysql while-loop sql-update

我有一个表格Tab1,其中包含以下6列

product_key, 
store_key, 
date_key (dates are stored as integer values. eg: '2013-july-28' is stored as 20130728),
delivery (no of quantities delivered on a day), 
sales (no of quantities sold on a day), 
inventory (no of quantities left at the end of day)). 

我 需要计算所有商店所有日期所有产品的库存,此表有3400000行和12个不同的商店,538个不同的产品和日期是2013年7月8日至2014年1月5日。

对于产品 - 商店组合,今天的库存=前一天库存+今天的交货 - 今天的销售。

我使用以下查询计算了所有产品 - 商店组合的第一个日期的库存。

    UPDATE tab1 a JOIN (SELECT sku_key,store_key,MIN(date_key) AS dt FROM tab1 
    GROUP BY sku_key,store_key )b  
    ON a.sku_key = b.sku_key AND a.store_key = b.store_key AND a.date_key = b.dt 
    set a.inventory = a.delivery-a.sales;

上述查询大约需要2分钟。然后计算每个产品 - 商店组合的其余日期的库存, 我写了以下查询。

SELECT MIN(date_key), MAX(date_key) INTO mndt,mxdt FROM tab1;
WHILE mxdt > mndt DO
-- this is to get the integer value of next day
    SELECT date_key INTO nxtdt FROM dim_date WHERE date = (select DATE_ADD(date,INTERVAL 1 DAY) FROM dim_date WHERE date_key = mndt);

    UPDATE tab1 a JOIN (SELECT store_key,sku_key,inventory FROM tab1 WHERE date_key=mndt )b  
        ON a.sku_key=b.sku_key AND a.store_key=b.store_key AND  a.date_key=nxtdt
    SET a.inventory=b.inventory+a.delivery-a.sales_quantity;
    SET mndt = nxtdt;

END WHILE;

此查询需要3个多小时才能完成。

我在(date_key),(sku_key和store_key),(sku_key和store_key以及date_key)上创建了索引。

有任何建议可以改善此流程的效果吗?

0 个答案:

没有答案