Bonjour,
Je cherche à mettre sur pied deux requêtes me permettant de consolider les valeurs présentes dans une colonne d'une de mes tables.
Cette table contient un nombre conséquent de lignes (environ 6 millions).
Parmi ces lignes, beaucoup (environ 5 millions) ne contiennent pas de valeur dans une des colonnes de cette table (ref_c, cf ci-dessous). Je compte définir cette valeur pour une majorité sinon l'ensemble des 5M sur la base des informations qu'ont en commun ces 5 millions de lignes incomplètes et le million restant, complet.
L'algorithme actuellement en place est basé sur la sélection des lignes incomplètes puis en la recherche d'une ligne complète pouvant convenir pour chacune puis enfin leur mise à jour.
Le nombre important de requêtes résultant augmente, je pense, beaucoup le temps de traitement, de l'ordre d'une journée actuellement.
L'algorithme est exécuté successivement au moins 3 fois car un seul passage n'élimine pas tous les trous.
Je souhaiterais mettre en place une seule requête, basée sur une jointure, qui réalise l'ensemble des opérations (d'une seule itération, les requêtes pourront être exécutée au moins 3x pour combler tous les trous) en un coup mais je désire avoir l'avis d'un expert avant de poursuivre mes recherches.
Voici la structure d'une table ressemblant à la mienne :
Et deux requêtes évoquant les recoupements à faire. Sont-elles correctes ? Cela sera-t-il plus efficace?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 CREATE TABLE maTable ( 'id' int(10) unsigned NOT NULL AUTO_INCREMENT, 'time' int(10) unsigned NOT NULL, 'ref_cp' int(10) unsigned DEFAULT NULL, 'ref_cl' int(10) unsigned DEFAULT NULL, 'connb' int(10) unsigned DEFAULT NULL, 'ref_c' int(10) unsigned DEFAULT NULL, 'ibhr' varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, 'ref_s' int(10) unsigned DEFAULT NULL, PRIMARY KEY('id'), KEY 'ref_c' ('ref_c'), KEY 'ref_cl' ('ref_cl'), KEY 'ibhr' ('ibhr'), KEY 'ref_s' ('ref_s'), KEY 'ref_cp' ('ref_cp') ) ENGINE=InnoDB
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 UPDATE maTable T1 JOIN maTable T2 ON T2.ibhr=T1.ibhr AND T2.time BETWEEN T1.time-10 AND T1.time+10 AND T2.ref_cl=T1.ref_cp SET T1.ref_c=T2.ref_c; UPDATE maTable T1 JOIN maTable T2 ON T2.connb=T1.connb AND T1.ref_s=T2.ref_s SET T1.ref_c=T2.ref_c;
Partager