IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Inserts trop gourmand en mémoire


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut Inserts trop gourmand en mémoire
    Bonjour, j'ai un soucis concernant des insertions dans une table héritée. Je veux insérer d'un coup :

    CREATE TRIGGER insert_trigger_temp BEFORE INSERT ON a FOR EACH ROW EXECUTE PROCEDURE public.insert_a();
    .. Insetion dans a avec (INSERT INTO a (p1,..,pn) VALUES (v1,..,vn))
    ;DROP TRIGGER insert_trigger_temp ON a;

    Avec un top, je vois que le processus grandit toutes les secondes (de 10Mo à 300Mo) jusqu'à saturation de la mémoire. Y a t'il un moyen de limiter le grossissement mémoire du processus via la configuartion du serveur?

    Voici mes parametres:

    max_connections = 44
    shared_buffers = 256MB
    temp_buffers = 32MB
    work_mem = 80MB
    maintenance_work_mem = 512MB
    max_stack_depth = 16MB
    max_fsm_pages = 2400160
    vacuum_cost_limit = 1000
    wal_buffers = 1MB
    checkpoint_segments = 32
    effective_cache_size = 1GB
    constraint_exclusion = on

    Postgres 8.2 sur FreeBSD 6.2
    4GO de RAM et 4Go de mémoire virtuelle
    Table de centaine de millions de ligne (4Go)
    Requete sur 100 000 lignes

    Je ne comprends même pas comment il peut depasser les 8Go...

    Edit:
    Le trigger, c'est juste ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    OK bool;
    BEGIN
    	SELECT INTO OK EXISTS(SELECT * FROM a  WHERE [... Unicity]);
    	IF( OK)THEN
    		return NULL;
    	ELSE
    		return NEW;
    	END IF;
    END;

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonjour, ça ne serait pas plus judicieux de faire une recherche de l'existance d'un enregistrement sur une colonne indexée

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Elle est faite par le trigger

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Le test d'unicité est en fait la clef primaire... Faut que je voie si il y a pas moyen de faire autrement (genre utiliser un mecanisme interne à Postgres pour que ça soit plus rapide)

    Sinon, avec un SELECT * FROM a WHERE (p1,...,p2) IN (...)
    où le IN contient pour 4Mo de données sous forme de texte, la base me fait un depassement de mémoire (plus de 8Go ...)
    Je ne comprends toujours pas

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    bonsoir , cela me parait plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IF NEW.cle IN ( SELECT cle FROM ma_table ) THEN return null;
    else 
    return  NEW;

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Ok merci.
    Mais je crois avoir trouvé un truc performant :
    Creer une fonction avec comme code:

    begin
    INSERT INTO master(p1,..,pn) VALUES(p_paramater.v1, ...,p_parameter.vn);
    exception when unique_violation then
    end;

    Ce qui revient juste à remplacer tous les insert par cet appel de fonction. Et je n'aurais pas a creer un trigger pour toutes les tables héritées de master (rappel : a était héritée).
    J'ai fais un test avec 120 000 lignes à rajouter, et ça s'est fait super rapidement (10s au lieu de 7minutes avec les triggers). Ca a monté au grand max à 1.5Go pas plus et toutes les lignes ont été inseré avec succés (même en cas d'exeception)...
    Mais ça ne me dit pas pourquoi des insert à la queueleuleu fait péter la base.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] count trop gourmande ?
    Par Anubis dans le forum Langage
    Réponses: 3
    Dernier message: 12/02/2007, 15h45
  2. [VB.net]Requete Insert trop longue?
    Par Hakki dans le forum Accès aux données
    Réponses: 7
    Dernier message: 24/10/2006, 10h06
  3. Insertion trop longue
    Par annalady dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/09/2006, 11h03
  4. Optimiser une table sur SQL server trop gourmande en CPU
    Par molarisapa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/06/2006, 16h17
  5. [Apache] très gourmand en mémoire ?
    Par Invité dans le forum Apache
    Réponses: 2
    Dernier message: 23/06/2004, 09h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo