|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 6 ![]() |
Bonjour à tous,
Ceci est mon premier message sur ce forum, j'espère ne pas vous décourager en postant cet énorme pavé, mais il me semble important d'expliquer en détail le problème pour pouvoir le résoudre... Dans le cadre d'un projet de monitoring très spécifique, je recherche une solution viable pour limiter le nombre d'entrées dans ma base de données. Le contexte est le suivant : Je reçoit des données de plusieurs centaines d'automates toutes les 5 minutes sous la forme de fichiers XML. J'effectue un traitement procédural pour stocker toutes les données dans une table qui contient un minimum d'INDEX, pour ne pas diminuer les temps d'écritures. Malheureusement, les données qui m'intéressent ne sont pas les données stockées toutes les 5 minutes, mais seulement les données stockées à l'instant T chaque heure. Exemple : Je reçoit 10 enregistrements d'un automate de 8h à 9h, je ne veux garder que le premier enregistrement dans l'heure (celui aux alentours de 8h/8h05), et supprimer les autres; Par contre, je ne peux en aucun cas faire mon tri sur les minutes, puisque les automates m'envoient les données à des moments différents (8h01/8h06 s'il est en retard, etc...). La requête que j'ai trouvée permettant de faire cela est : Code :
En clair la requête vérifie que pour chaque enregistrement, les champs obligatoires existent au moins une fois (wb_serial + type + seriennummer ) et tout cela à chaque plage horaire. Je me confronte à deux problèmes : 1 / Si j'exécute la requète plusieurs fois, il trouve toujours des enregistrement à enlever jusqu'à un certain point!? Exemple (uniquement sur le SELECT après avoir exécuté la requête): - 1ere fois : 1700 résultats - 2eme fois : 1600 résultats - 3eme fois : 1500 résultats .. - 10 eme fois : 900 résultats - 11 eme fois : 900 résultats 2 / Vu que le problème est récurrent en ligne, et ne se présente jamais en local, j'en vient à penser que cela puisse venir de ma base en ligne ? Config en ligne : Code :
Code :
|
||||||
|
|
00
|
|
|
#2 | |||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Quelques questions :
1/ Pourquoi insérer les lignes si c'est pour les supprimer. 2/ Qu'entends tu par : Citation:
Que donne : Code :
|
|||
|
|
00
|
|
|
#3 | ||||
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 6 ![]() |
@skuatamad
Merci de ta réponse, 1/ Réflexion pertinente, j'en conviens, cela peut paraître surprenant. J'ai bien sur pensé à filtrer en amont les enregistrements faits dans ma base de données, mais ce n'est pas simple à incorporer dans le process du traitement (ZIP => XMLs => BDD et j'en passe). Par ailleurs, il faut que je m'assure que le premier enregistrement dans l'heure n'est pas une valeur de minute supérieur à 5 (ex:12:06:10). Mais, c'est aussi une piste que j'envisage. EDIT : Malheureusement, après une batterie de tests, je confirme: Les automates ne m'envoient pas systématiquement un enregistrement entre 12:00 et 12:15 par exemple. Le cas échéant, si une valeur m'est envoyée à 12:16, celle-ci devient la première valeur de l'heure en cours, et je doit pouvoir l'utiliser. 2/ J'entendais juste par la que c'était le seul moyen de faire un DELETE avec un SELECT, ni plus ni moins. 3/ Cette requête ne renvoie pas ce qu'il faut. Dans ce que tu me propose (au passage, je te remercie de prendre du temps pour te pencher sur le problème), on fait un SELECT par rapport à l'uid min. Dans mon cas, l'uid n'a pas vraiment de rapport avec le premier enregistrement dans l'heure. Je vais tenter de montrer un exemple simple de la table que j'ai : Code :
Code :
|
||||
|
|
00
|
|
|
#4 | |
|
Membre confirmé
![]() |
Salut.
As-tu pensé à utiliser un trigger "BEFORE INSERT" sur ta table ? Dans ce trigger tu pourrais faire : Citation:
__________________
define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas. |
|
|
|
00
|
|
|
#5 | ||||
![]() ![]() |
Quel est le premier timestamp par heure pour chaque automate ?
Code :
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||||
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Saluton,
La solution du trigger de GyZmoO mérite qu'on s'y attarde, non ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#7 |
![]() ![]() |
J'ai cru comprendre, à la lecture du premier message de HpXtech, que son processus récupère de toute façon toutes les données dans une table. Ma requête permet d'extraire de cette table seulement les lignes qui l'intéresse afin d'alimenter la vraie table de données à exploiter.
Mais s'il s'agit d'améliorer le processus d'importation des données pour n'alimenter MySQL qu'avec les données finales alors peut-être que le trigger est meilleur. Tout dépend comment se déroule le processus d'importation des données. Si c'est au coup par coup, même avec un flux de données très rapide en provenance des automates, le trigger est probablement meilleur puisqu'on traite les données au fur et à mesure qu'elles arrivent. Si par contre c'est une importation en masse des données des automates à périodes régulières, il vaut mieux je pense importer en masse dans une table d'importation de MySQL à l'aide par exemple d'une requête LOAD DATA INFILE puis utiliser ma requête pour extraire les données intéressantes.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#8 | ||
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 6 ![]() |
Merci pour toutes vos réponses.
Je retiens effectivement de nombreuses remarques pertinentes : - la colonne "timestamp" est à renommer pour éviter toute ambiguïté avec TIMESTAMP. - Les requêtes de CinePhil fonctionnent, tout comme celle que j'utilisais au départ mais semble plus rapide avec les quelques tests que j'ai pu faire. Je ne suis pas familier avec le système de triggers, mais il semble que ce soit dans mon cas la meilleure solution. L'idée de départ : Si la combinaison "wb_serial", "timestamp", "type", "seriennummer", annee, mois, jour, heure n'existe pas dans la base de donées, par rapport à l'enregistrement en cours, alors on insère une ligne. Je vais faire quelques recherches pour trouver la syntaxe exacte. EDIT : après quelques recherches...mon premier trigger Je suis parti du principe qu'il fallait comparer la ligne qu'on veut insérer (ROW ?) avec ce que j'ai dans la base de données. Si on trouve un enregistrement identique, on fait rien, sinon on ajoute l'enregistrement. Mais quelque chose m'échappe... Le trigger c'est un "déclencheur", donc je le crée et après j'y touche plus? J'imagine qu'il faut juste autoriser l'enregistrement dans le ELSE, mais comment faire ? Code :
|
||
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() ![]() Avcxjo MoKoRetraité Inscription : novembre 2005 Messages : 2 530 ![]() |
Inverse la condition IF NOT EXISTS et ne mets pas de ELSE.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof articles : Comment émuler un tableau croisé [quasi] dynamique et : Une énigme mathématique résolue avec MySQL recommande l'utilisation de PDO (PHP5 Data Objects) |
|
00
|
|
|
#10 | ||
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 6 ![]() |
Ok!
Soit le code suivant : Code :
Parce qu'en lisant la doc, je me suis aperçu qu'un TRIGGER on le pré-paramètre avant de lancer les requêtes. Donc j'imagine qu'il faut dire dans le THEN "Autorises l'insertion" ou "Insères dans `webbox` les enregistrements en cours", mais comment ? |
||
|
|
00
|
|
|
#11 | ||
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 6 ![]() |
Bonjour à tous,
Après de pas mal de recherches je pense avoir trouvé la syntaxe pour créer mon trigger, mais mysql me renvoi mon message d'erreur préféré : You have an error in your SQL syntax; [...] near ' ' at line 50. Code :
|
||
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 6 ![]() |
Bonjour,
Je n'ai toujours pas réussi à résoudre ce problème de syntaxe au niveau du trigger, même si ça semble être LA solution idéale. Dans tous les cas les réponses qui m'ont été apportées concernant la suppression des lignes pour chaque heure marchent nickel, et cela résout en grande partie mon problème. Merci à vous, je passe le sujet en résolu. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com