Bonjour à tous,
Dans une table, j'enregistre des relevés de compteurs. Cette lecture me conduit à obtenir des suites de valeurs identiques. J'aimerais supprimer les valeurs identiques les plus anciennes et ne conserver que la la récente.
La table comporte environs 2,5 millions d'enr et les compteurs sont aux nombres de 5600.
Par la suite, je ne parle plus de la rubrique TIMESTAMP nommée DateHeure qui n'a pas d'intérêt ici.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 CREATE TABLE Informations ( IDInformations INT(10) UNSIGNED NOT NULL AUTOINCREMENT, DateHeure TIMESTAMP NOT NULL, Valeur VARCHAR(50) NOT NULL, IDVersions_Machines INT(10) UNSIGNED NOT NULL, IDTypesInformation INT(10) UNSIGNED NOT NULL, INDEX Index 1 (IDInformations), INDEX Index 2 (IDVersions_Machines), INDEX Index 3 (IDTypesInformation) ) COLLATE='utf8_general_ci' ENGINE=MyISAM
Exemple de données à supprimer :
Ce que je fais pour l'instant, c'est construire une table temporaire contenant les ID des valeurs à conserver puis un DELETE .... WHERE NOT IN ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 1 120000 99 324 : A supprimer car 3 2 bleu 124 212 : A supprimer car 4 3 120000 99 324 : RAS 4 bleu 124 212 : A supprimer car 6 5 122000 99 324 : RAS 6 bleu 124 212 : A supprimer car 4
Et c'est catastrophiquement long !
La requête de sélection des valeurs à conserver
Cette requête est appelée dans une procstock avec un curseur dont je me sers pour lui passer une paire de valeurs (entIDTypesInformation, entIDVersions_Machines) pour fractionner le traitement
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 INSERT INTO InformationsTmp(IDInformations) SELECT SAV1.IDInformations FROM InformationsSAV SAV1 WHERE IDTypesInformation=entIDTypesInformation AND IDVersions_Machines=entIDVersions_Machines -- Je conserve si la valeur suivante est identique AND SAV1.Valeur<> (SELECT SAV2.Valeur FROM InformationsSAV SAV2 WHERE SAV2.IDInformations>SAV1.IDInformations AND SAV2.IDTypesInformation=SAV1.IDTypesInformation AND SAV2.IDVersions_Machines=SAV1.IDVersions_Machines ORDER BY SAV2.IDInformations ASC LIMIT 1 ) -- Je conserve toujours la dernière valeur AND SAV1.IDInformations<> (SELECT MAX(SAV2.IDInformations) FROM InformationsSAV SAV2 WHERE SAV2.IDTypesInformation=SAV1.IDTypesInformation AND SAV2.IDVersions_Machines=SAV1.IDVersions_Machines )
Un index sur Valeur arrangerait-il quelque peu les perf ?
Partager