Bonjour,
Je vous soumet ce problème de performance auquel je suis confronté sous Postgres sur une très grosse base.
J'ai une table de capteurs (près de 500 000 capteurs) qui enregistrent une valeur certains jours. Je veux trouver "les plus proches voisins" de chaque capteur, pas en terme de distance mais en terme de valeurs. Je calcule donc l'écart moyen entre chaque capteur pour un même jour (sur un an)... en 2 étapes...
Mes performances sont très mauvaises, particulièrement lors de la 1ere étape où je fais un produit cartésien sur ma table capteurs (plus de 150 millions de lignes) que j'appelle dans une boucle (i):
Code :
SELECT capteurs.date, capteurs.capteur_id, capteurs.valeur, c2.capteur_id AS capteurs_id2, c2.valeur AS valeur2
FROM capteurs
JOIN capteurs c2 ON capteurs.date = c2.date
WHERE capteurs.capteur_id = i;
Résultat:
date | capteur_id | valeur | capteur_id2 | valeur2
--------------------------------------------------
01/01| 1 | 10| 2 | 09
02/01| 1 | 09 | 3 | 09
03/01| 1 | 07 | 4 | 08
etc...
Cette première étape m'affiche les données d'un capteur,avec les valeurs de tous les capteurs qui ont enregistré une mesure à la même date.
Sous Postgres, pour traiter 1 capteur, il faut près de 30 min ...
Comment optimiser ce traitement (j'ai mis un index sur capteur_id) ?
Lors de l'étape 2 j'utilise la table temporaire générée en 1 pour calculer les capteurs les plus "proches".
Merci de votre aide précieuse.
Partager