2010-05-06 3 views
1

QuêteOptimiser les instructions d'insertion maître-détail

Après une journée de course (contre près de 1 Go de données), un ensemble de déclarations dégringolent jusqu'à 40 inserts par seconde. Je cherche à augmenter cela d'un ordre de grandeur ou deux.

Code SQL

Le code pour insérer les informations se décline en deux parties: un dossier maître et les enregistrements de détail. La fiche:

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

Les enregistrements détaillés:

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); 

Solution proposée

La solution proposée élimine regardant chaque MONTH_REF_ID en les stockant dans une variable locale, comme suit:

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

Les déclarations de détail deviennent alors:

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); 

Contraintes

Le tableau MONTH_REF a une AUTO_INCREMENT clé primaire et est indexé sur elle. La table DAILY n'a aucun index et aucune clé primaire. Une clé primaire peut être ajoutée à la table DAILY, si cela peut vous aider.

Question

Qu'est-ce qu'un moyen plus efficace pour exécuter le (milliards ou) d'insérer des déclarations que la solution proposée?

Merci!

Répondre

1

Cette solution fonctionne:

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); 

Inserts a augmenté d'environ quatre ordres de grandeur.

+0

Vous pouvez simplifier l'instruction SET comme ceci: 'SET @month_ref_id = LAST_INSERT_ID();' –

+0

Content de l'entendre. –

Questions connexes