#1 Tue 21 September 2021 16:14
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 199
Paramétrage BD requête lourde
Bonjour,
J'ai une requête lourde (certains savent déjà laquelle ^^), ou j'additionne les valeurs au fil de l'eau. Sur un très faible volume de données (30 écritures) celle ci fonctionne, en revanche lorsque je passe sur un volume plus conséquent (11 000 enregistrements) j'ai systématiquement un échec d'écriture.
Je me suis rapproché du SI afin de voir les capacités allouées à la base et augmenter les ressources.
J'ai fait :
* vacuum analyse & index sur les données
* passé de 2 go à 8 go la RAM,
* modifié les paramètres de cache et mémoire de travail de postgres.
et rebelotte message d'erreur. J'ai du coup rapatrier les données sur ma base local (j'ai plus d'espace disque disponible), re-éxécuter la requête, et la ca tourne beaucoup plus longtemps mais vient un moment ou l'intégralité de l'espace disque est saturé et j'en arrive au même point.
Je suis entrain de faire un test en faisant sur un échantillon plus gros en ajoutant une limite => "select * from (with recursive ...) as tab limit 10;" mais pareil ca mouline dans le vide ..
La question que je me pose, est-ce-qu'augmenter encore plus la ram sur le serveur serait utile ? y'aurait-il un bridage interne à la base qui fait que la requête ne passe pas ?
Hors ligne
#2 Tue 21 September 2021 16:26
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1542
Re: Paramétrage BD requête lourde
Bonjour,
Quel est le message d'erreur pg ?
Si c'est un pb d'écriture (disque plein), il faut juste un disque plus grand. Il n'y a pas de paramètres PG pour changer ca.
Sur une requête récursive, ca sent plutot la requête qui ne finit jamais (vous remplirez toujours le disque dans ce cas). Quelle est la condition de stop sur cette requête ?
Nicolas
Hors ligne
#3 Tue 21 September 2021 16:46
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 199
Re: Paramétrage BD requête lourde
Le disque du serveur est effectivement pas très conséquent il reste 19go de disponible En revanche en local j'ai 140 go de disponible.
Je ne sais pas si on peut parler d'une condition de stop mais j'effectue select sum(distinct valeur), id FROM Rercursive group by id donc d'après moi c'est l'id.
et si je cherche pas à récupérer le résultat de la requête au travers d'un select ou create table, ca mouline (durant 7 minutes) , m'affiche que la requête a parfaitement été exécutée.
Hors ligne
#4 Tue 21 September 2021 16:52
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1542
Re: Paramétrage BD requête lourde
S'il s'agit de la requête du fil "répercuter des valeurs d'un segment à un autre", s'il y a un cycle dans vos données, la recursion ne s'arretera jamais, la requête non plus => vous remplissez le disque dur dans tous les cas.
Vous pouvez éviter ces récursions infinies en stockant les id déjà rencontrés, et en vous arrêtant quand vous rencontrez de nouveau le même id:
Code:
WITH RECURSIVE walk_network (v19, id_bdcarth, id_nd_ini,id_nd_fin) AS ( select 0, n.id_bdcarth, n.id_nd_ini, n.id_nd_fin, array[n.id_bdcarth] as ids from hydro_subset n LEFT JOIN hydro_subset b ON n.id_nd_ini = b.id_nd_fin WHERE b.id_nd_ini is null UNION ALL SELECT n.v19+ w.v19, n.id_bdcarth, n.id_nd_ini, n.id_nd_fin, ids || n.id_bdcarth FROM somme_join n, walk_network w WHERE w.id_nd_fin = n.id_nd_ini and not (n.id_bdcarth = any(ids)) ) SELECT sum(distinct v19), id_bdcarth FROM walk_network group by id_bdcarth;
Nicolas
Hors ligne
#5 Tue 21 September 2021 17:07
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 199
Re: Paramétrage BD requête lourde
,
Je vais tester ça en local, sur le serveur ça m'a reproduit la même erreur.
Hors ligne
#6 Tue 21 September 2021 18:52
- neskuik01
- Participant assidu
- Date d'inscription: 16 Feb 2015
- Messages: 199
Re: Paramétrage BD requête lourde
Après avoir laisser mouliner une bonne heure il m'a retourné un message :
ERREUR: n'a pas pu écrire dans le fichier « base/pgsql_tmp/pgsql_tmp12444.20235 » : No space left on device
Hors ligne
#7 Wed 22 September 2021 08:05
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1542
Re: Paramétrage BD requête lourde
Donc la requête ne finit jamais, en mode create table, cela remplit le disque.
Il faut vérifier les données et les conditions de stop.
Nicolas
Hors ligne