2010-05-06 4 views
1

ЗаданиеОптимизация мастер-деталь заявления вставки

После дня работы (против почти 1 Гб данных), набор заявлений упасть до 40 вставок в секунду. Я хочу увеличить это на порядок или два.

SQL Code

Код для вставки информации из двух частей: основной записи и детализации записей. Мастер записи:

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();' –

+0

Рад это слышать. –

Смежные вопросы