![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: novembre 2006
Messages: 64
|
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 :
OK bool; BEGIN SELECT INTO OK EXISTS(SELECT * FROM a WHERE [... Unicity]); IF( OK)THEN RETURN NULL; ELSE RETURN NEW; END IF; END; Dernière modification par ledjlale ; 05/11/2008 à 12h35 |
|
|
|
|
|
#4 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: novembre 2006
Messages: 64
|
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 Dernière modification par ledjlale ; 05/11/2008 à 20h12 |
|
|
|
|
|
#6 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: novembre 2006
Messages: 64
|
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. |
|
|
|
|
![]() |
![]() |
||
Inserts trop gourmand en mémoire
|
||
| Outils de la discussion | |
|
|