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
表中。
問題
什麼是執行(十億左右)插入比建議的解決方案報表更有效的方法?
謝謝!
您可以像這樣簡化SET語句: 'SET @month_ref_id = LAST_INSERT_ID();' – 2010-05-06 16:44:16
很高興聽到它。 – 2010-05-06 19:09:42