Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Tue 21 September 2021 16:14

neskuik01
Participant assidu
Date d'inscription: 16 Feb 2015
Messages: 193

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: 1534

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: 193

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: 1534

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: 193

Re: Paramétrage BD requête lourde

smile,

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: 193

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: 1534

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

 

Pied de page des forums

Powered by FluxBB