Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 Re : PL/pgSQL » Lenteur d’exécution d'un Update simple » 23/04/2020 22:19:17
compris , merci !
Pour une base quasi complète à 112 000 lignes , moi : + de 6 heures , moi après vos explications 1 minutes , vous 21s ....
ça va être utile car au final je pense rajouté une dizaine de colonnes.
merci encore et bonne soirée
#2 Re : PL/pgSQL » Lenteur d’exécution d'un Update simple » 23/04/2020 13:52:04
Donc juste pour finir la conversation je met ici le bon code :
UPDATE eniram SET tag_559 = tag_23 - tag_30;
UPDATE eniram SET tag_560=CASE WHEN tag_220=0 THEN 0
ELSE (tag_559 *1000) / ((tag_220/100)*11553)
END;
Je suis passé de 6 heures à 2s .... merci encore
#3 Re : PL/pgSQL » Lenteur d’exécution d'un Update simple » 23/04/2020 09:46:43
Donc j'ai fait pour ma première colonne juste un :
UPDATE eniram SET tag_559 = tag_23 - tag_30;
ça marche en 128ms....purée que je suis con, je dois être trop habitué au boucle en c et VB .... je vois pour le CASE....merci beaucoup !
#4 PL/pgSQL » Lenteur d’exécution d'un Update simple » 22/04/2020 23:34:41
- bert2713d
- Réponses : 6
Bonjour ,
Je débute sur Postgresql . Mon projet est le suivant. J'importe des fichier csv dans une table qui se nomme "eniram". Une fois importé , j'ai environ 29 000 lignes pour 558 colonnes. Il s'agit de relevé temporel de capteurs pression , températures , etc. Après j'utilise grafana pour faire de jolis dashboard.
Mon problème est que j'ai besoin de faire de petits calculs entre les capteurs . Ex : conso = capteur1 - capteur 2. Donc j'ai voulu faire une moulinette en PL . ça marche. Mais c'est hyper long (des heures) et pourtant je travail en local sur mon PC.
J'aurais voulu savoir si cela vient de mon code ou si l'update d'une table est de toute façon très long et qu'il faut mieux le faire en amont sur les différents CSV importé.
Voici mon code, j'ai ici limité la modification à l'insertion de deux colonnes(tag_559 & tag_560) . A partir de deux capteurs je fais juste deux petits calculs que j'UPDATE dans les nouvelles colonnes.
Au début je ne comprenait pas pourquoi les valeurs renvoyés des Select dans la boucle faisaient n'importe quoi , j'ai resolu le problème avec les "order by" (apparemment il garde pas le classement entre deux select).
ALTER TABLE eniram ADD COLUMN tag_559 NUMERIC (20,6);
ALTER TABLE eniram ADD COLUMN tag_560 NUMERIC (20,6);
SELECT addcolum();
CREATE OR REPLACE FUNCTION addcolum () RETURNS VOID
AS $$
DECLARE
I INTEGER;
compteur NUMERIC(20,0);
jour TIMESTAMP;
flowin Numeric(20,6);
flowout Numeric(20,6);
resultat Numeric (20,6);
charge Numeric (20,6);
resultat2 NUMERIC(20,6);
BEGIN
flowin = 0;
flowout=0;
resultat=0;
I=0;
compteur=0;
SELECT COUNT(*) INTO compteur FROM eniram;
FOR I IN 1..compteur
LOOP
SELECT tag_2 INTO jour FROM eniram ORDER BY tag_2 OFFSET I LIMIT 1;
SELECT tag_23 INTO flowin FROM eniram ORDER BY tag_2 OFFSET I LIMIT 1;
SELECT tag_30 INTO flowout FROM eniram ORDER BY tag_2 OFFSET I LIMIT 1;
SELECT tag_220 INTO charge FROM eniram ORDER BY tag_2 OFFSET I LIMIT 1;
resultat = flowin - flowout ;
if charge =0 then resultat2=0; else resultat2= resultat *10 / charge; end if;
UPDATE eniram SET tag_559 = resultat WHERE tag_2 = jour ;
UPDATE eniram SET tag_560 = resultat2 WHERE tag_2 = jour ;
END LOOP;
END;
$$ language plpgsql ;
merci d'avance
et bonne soirée
Bertr2713d
Pages : 1