Bonjour,
Je ne connais que depuis peu plpgsql et j'essaye d'executer une requête. Le problème est que ma table contient 17 Millions d'entrées donc cela prend énormement de temps.
Mon but est de supprimer toutes données selon la règle suivante :
Si je trouve une données avec resol=5 ou resol=10
Je dois regarder dans toute la table si des données, avec l'attribut resol=2.5 et que la date et time sont égales à la donnée de resol=2.5, existent, alors j'incrémente mon compteur.
J'ai utilisé des curseurs (peut être pas la meilleure solution), et voici donc la requête que je cherche à optimiser :
Cette requête prend 27 minute de temps d'execution sur une table contenant 80000 données (table de test), donc pour ma table à 17M, j'imagine pas le nombre d'heures :/
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 CREATE OR REPLACE FUNCTION cleanCOLOR5 () RETURNS integer AS $$ DECLARE c1 CURSOR FOR SELECT * FROM "TABLE"; gid_record_0 "TABLE"%ROWTYPE; gid_record_1 "TABLE"%ROWTYPE; count INTEGER := 0; uniqueGid INTEGER := 0; BEGIN OPEN c1; LOOP FETCH c1 INTO gid_record_0; EXIT WHEN NOT FOUND; uniqueGid := 0; IF gid_record_0.satel = 5 AND (gid_record_0.resol = 5 OR gid_record_0.resol = 10) AND gid_record_0.mode = 'COLOR' THEN SELECT INTO gid_record_1 gid FROM TABLE as a2 WHERE a2.satel = 5 AND a2.resol = 2.5 AND a2.mode = 'COLOR' AND a2.date_acq_f = gid_record_0.date_acq_f AND a2.time_acq = gid_record_0.time_acq; IF FOUND THEN uniqueGid := 1; END IF; END IF; IF uniqueGid = 0 THEN count := count + 1; RAISE NOTICE 'count = %',count; END IF; END LOOP; CLOSE c1; RETURN(count); END; $$ LANGUAGE plpgsql; SELECT cleanCOLOR5();
Je sais pas si j'ai été clair mais j'espere que cette requête pourra être optimisée, merci
Partager