Forum des développeurs  

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é.
Précédent   Forum des développeurs > Bases de données > PostgreSQL

PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL

Réponse
 
Outils de la discussion
Vieux 05/11/2008, 12h25   #1 (permalink)
Nouveau membre du Club
 
Date d'inscription: novembre 2006
Messages: 64
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 :
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
ledjlale est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/11/2008, 13h55   #2 (permalink)
Membre habitué
 
Date d'inscription: janvier 2006
Messages: 159
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
xavier-Pierre est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/11/2008, 15h42   #3 (permalink)
Nouveau membre du Club
 
Date d'inscription: novembre 2006
Messages: 64
Par défaut

Elle est faite par le trigger
ledjlale est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/11/2008, 19h34   #4 (permalink)
Nouveau membre du Club
 
Date d'inscription: novembre 2006
Messages: 64
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

Dernière modification par ledjlale ; 05/11/2008 à 20h12
ledjlale est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/11/2008, 20h50   #5 (permalink)
Membre habitué
 
Date d'inscription: janvier 2006
Messages: 159
Par défaut

bonsoir , cela me parait plus simple
Code :
IF NEW.cle IN ( SELECT cle FROM ma_table ) THEN RETURN NULL;
else 
RETURN  NEW;
xavier-Pierre est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/11/2008, 21h39   #6 (permalink)
Nouveau membre du Club
 
Date d'inscription: novembre 2006
Messages: 64
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.
ledjlale est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/11/2008, 21h51   #7 (permalink)
Membre habitué
 
Date d'inscription: janvier 2006
Messages: 159
Par défaut

c'est bon à savoir ,j'adopte
xavier-Pierre est déconnecté   Envoyer un message privé Réponse avec citation
NEWS POSTGRESQLF.A.Q POSTGRESQLUDF POSTGRESQLLIVRES POSTGRESQL

Réponse

Précédent   Forum des développeurs > Bases de données > PostgreSQL



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide