2010-05-06 82 views
1

任務優化主詳細插入語句

運行(針對近1 GB的數據)的一整天后,一組語句被向下翻滾每秒40個插入。我正在尋求增加一個或兩個數量級。

SQL代碼

插入信息有兩個部分的代碼:一個主記錄和詳細記錄。主記錄:

INSERT INTO MONTH_REF (DISTRICT_ID, STATION_ID, CATEGORY_ID, YEAR, MONTH) VALUES 
('101', '0066', '010', 1984, 07); 

的詳細記錄:

INSERT INTO DAILY (MONTH_REF_ID, AMOUNT, DAILY_FLAG_ID, DAY) VALUES ((SELECT ID 
FROM MONTH_REF M WHERE M.DISTRICT_ID = '101' AND M.STATION_ID = '0066' AND M.CAT 
EGORY_ID = '010' AND M.YEAR = 1984 AND M.MONTH = 07), 0, ' ', 1); 

INSERT INTO DAILY (MONTH_REF_ID, AMOUNT, DAILY_FLAG_ID, DAY) VALUES ((SELECT ID 
FROM MONTH_REF M WHERE M.DISTRICT_ID = '101' AND M.STATION_ID = '0066' AND M.CAT 
EGORY_ID = '010' AND M.YEAR = 1984 AND M.MONTH = 07), 0.5, ' ', 2); 

INSERT INTO DAILY (MONTH_REF_ID, AMOUNT, DAILY_FLAG_ID, DAY) VALUES ((SELECT ID 
FROM MONTH_REF M WHERE M.DISTRICT_ID = '101' AND M.STATION_ID = '0066' AND M.CAT 
EGORY_ID = '010' AND M.YEAR = 1984 AND M.MONTH = 07), 0, 'T', 3); 

建議的解決方案

所提出的解決方案消除了通過將其存儲在局部變量查找每個MONTH_REF_ID,如下所示:

INSERT INTO MONTH_REF (DISTRICT_ID, STATION_ID, CATEGORY_ID, YEAR, MONTH) VALUES 
('101', '0066', '010', 1984, 07); 

SET @month_ref_id := (SELECT LAST_INSERT_ID()); 

細節陳述然後變成:

INSERT INTO DAILY (MONTH_REF_ID, AMOUNT, DAILY_FLAG_ID, DAY) VALUES (@month_ref_id, 0, ' ', 1); 
INSERT INTO DAILY (MONTH_REF_ID, AMOUNT, DAILY_FLAG_ID, DAY) VALUES (@month_ref_id, 0.5, ' ', 2); 
INSERT INTO DAILY (MONTH_REF_ID, AMOUNT, DAILY_FLAG_ID, DAY) VALUES (@month_ref_id, 0, 'T', 3); 

約束

MONTH_REF表具有AUTO_INCREMENT主鍵和被索引就可以了。 DAILY表沒有索引,也沒有主鍵。如果有幫助,主鍵可以添加到DAILY表中。

問題

什麼是執行(十億左右)插入比建議的解決方案報表更有效的方法?

謝謝!

回答

1

此解決方案:

INSERT INTO MONTH_REF (DISTRICT_ID,STATION_ID,CATEGORY_ID,YEAR,MONTH) VALUES('101','QFEG','012',1973,08); 
SET @month_ref_id := (SELECT LAST_INSERT_ID()); 
INSERT INTO DAILY (MONTH_REF_ID,AMOUNT,DAILY_FLAG_ID,DAY) VALUES(@month_ref_id,0,' ',1),(@month_ref_id,0,' ',2),(@month_ref_id,0,' ',3); 

插入上升約四個數量級。

+0

您可以像這樣簡化SET語句: 'SET @month_ref_id = LAST_INSERT_ID();' – 2010-05-06 16:44:16

+0

很高興聽到它。 – 2010-05-06 19:09:42