PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » problème de création de tables » 25/10/2010 13:23:25

OK j'ai refait les requêtes en déplaçant les fk et les index en fin.


merci beaucoup

RB

#2 Re : Général » problème de création de tables » 25/10/2010 11:03:53

je reviens donc sur ma première remarque : est ce qu'un commit peut regler le pb ?

ça ne ferait que 90 millions de transactions à la fois !!

#3 Re : Général » problème de création de tables » 25/10/2010 10:39:54

je fais 50 fois les 3 instructions en remplaçant tble_old_x1 par tble_old_xi (i=1 à 50) et tble_x1 par tble_xi (i=1 à 50) final ne changeant pas

#4 Re : Général » problème de création de tables » 25/10/2010 10:09:43

OK voici la rq :

CREATE TABLE tble_x1
(
  id integer NOT NULL, 
  la integer NOT NULL, 
  lb smallint NOT NULL, 
  lc smallint NOT NULL, 
  ld smallint NOT NULL, 
  le smallint NOT NULL, 
  lf double precision NOT NULL, 
  lg double precision NOT NULL, 
  lh smallint NOT NULL,
  li character varying(15) NOT NULL, 
  lj double precision NOT NULL, 
  lk double precision NOT NULL, 
  ll double precision NOT NULL, 
  CONSTRAINT pk_tble_x1 PRIMARY KEY (la, lb, lc, ld, le, lh, li),
  CONSTRAINT fk_tble_x1 FOREIGN KEY (lh)
      REFERENCES tblep (id_p) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT,
  CONSTRAINT fk_tble_par FOREIGN KEY (la)
      REFERENCES tble_par (la) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT,
  CONSTRAINT fk_tble_ref FOREIGN KEY (li)
      REFERENCES tble_def (lili) MATCH SIMPLE
      ON UPDATE RESTRICT ON DELETE RESTRICT
);
CREATE INDEX idx_tble_x1
  ON tble_x1
  USING btree
  (id, la);

INSERT INTO tble_x1 ( id, la, lb, lc, ld, le, lf, lg, lh, li, lj, lk, ll )
SELECT tble_old_x1.id,  tble_old_x1.la,  tble_old_x1.lb,  tble_old_x1.lc, final.ld,  tble_old_x1.le,  tble_old_x1.lf,
tble_old_x1.lg,  tble_old_x1.lh,  tble_old_x1.li,  tble_old_x1.lj,  tble_old_x1.lk,  tble_old_x1.ll
FROM  tble_old_x1 INNER JOIN final ON ( tble_old_x1.ld = final.jourref) AND ( tble_old_x1.lc = final.lc);

final correspond à une serie de 10 requêtes

#5 Général » problème de création de tables » 25/10/2010 09:22:23

rbidocho
Réponses : 8

Bonjour,

j'ai une bdd sous pg qui contient près de 200 tables. J'ai voulu créer une cinquantaine de tables supplémentaires à partir de 50 tables existantes. Les tables existantes font à peu près 3GO pour 30 millions de lignes.
Au bout de 4 jours, le journal de log m'affiche :

2010-10-23 04:47:41 CESTERREUR:  ne peux pas avoir plus de 2^32-1 commandes dans une transaction

Aurais je du mettre un COMMIT après chaque couplet de requêtes (1 création de table + 1 requête d'insertion de données) afin de valider chaque requête ?

merci d'avance,

RB

config :

pg 8.4.5 sous windows server 2003 64bits

#6 Re : Général » execution d'un fichier sql sous pgadmin » 21/07/2010 14:47:04

Ok je vais essayer l'éxécution de mon script de mise à jour de mes 600 000 lignes.

Est ce que un vacuum nettoiera la table et la mettre au régime ??

RB

#7 Re : Général » execution d'un fichier sql sous pgadmin » 21/07/2010 08:33:55

Bonjour,

Après quelques jours les pieds dans l'eau je reviens avec ma question du départ, qui est comment mettre à jour toutes les valeurs de 5 colonnes d'une table contenant un peu plus de 600 000 lignes ?
Comme écrit précédemment j'ai créé le script sql contenant les 600 000 update mais vous avez l'air de dire que cela n'est pas la meilleur chose à faire !! (et je ne m'en offusque pas :-))

Pour en revenir aussi à l'interrogation de Guillaume sur les erreurs que j'avais déjà remarqué, je l'avais écrit dans le message intitulé "Mise à jour d'une "grosse" table" qui date du 8/07/2009.
Voici ce que j'écrivais :

RB a écrit :

rebonjour,

l'erreur viendrait de pgadmin qui ne supporte pas de réaliser quelques 36600 requêtes !!!

j'ai juste effectué ces requêtes en 3 fois.

merci encore de vos aides

RB

Merci

RB

#8 Général » execution d'un fichier sql sous pgadmin » 10/06/2010 10:30:09

rbidocho
Réponses : 7

Bonjour,

Voilà j'ai créer un fichier sql qui contient un peu plus de 600 000 lignes de commandes update qui vont agir sur une table.

J'avais déjà remarqué que faire plus de 10 000 requêtes à la suite sous pgadmin menait à des erreurs.

est il possible de faire un EXECUTE fichier.sql sous pgadmin même si ce fichier contient plus de 600 000 lignes (et est ce la bonne commande ?) ?

Merci

RB

#9 Général » ALTER COLUMN et VIEW liée » 26/05/2010 16:06:51

rbidocho
Réponses : 1

Bonjour,

Je suis en train de mettre à jour une BDD en essayant de mettre le même TYPE aux colonnes désignant la même chose dans les différentes tables.

RB a écrit :

ALTER TABLE tble1 ALTER id TYPE integer;

mais je suis tombé sur cette erreur :

RB a écrit :

ERREUR:  ne peut pas modifier le type d'une colonne utilisée dans une vue ou une règle
DETAIL:  règle _RETURN activevue "vue_1" dépend de la colonne « id »

********** Erreur **********

ERREUR: ne peut pas modifier le type d'une colonne utilisée dans une vue ou une règle
État SQL :0A000
Détail :règle _RETURN activevue "vue_1" dépend de la colonne « id »

La question est donc comment changer le type d'une colonne qui est utilisée dans plusieurs vues sans avoir à supprimer toutes les vues en questions et les refaire après avoir changé le type de colonne ??

Merci d'avance pour vos réponses,

RB

#10 Re : Général » affichages de messages dans pgadmin » 25/05/2010 10:54:01

gleu a écrit :

A chaque fois, il m'affiche "ATTENTION: aucune transaction en cours"

Tout simplement parce que vous n'avez pas commencé de transactions. Attention, ce n'est qu'en 1.12 que pgAdmin dispose d'une configuration lui permettant de ne pas faire d'autocommit.

J'ai la dernière version sortie (enfin j'espère) installer il y a 2 semaines je crois (pgAdmin v1.10.3 installée le 15/05/2010).

gleu a écrit :

Est il possible de faire afficher (par ex.) : la requête "maj de la table/colonne machin/truc" a été réalisée"  dans la l'onglet messages de pgadmin ???

Non, et je ne vois pas trop l'intérêt. Si vous avez eu une erreur, pgAdmin l'affiche immédiatement.

C'est pas trop pour les erreurs. C'était juste pour savoir qu'il venait de faire telle ou telle requête. Mais si c'est pas possible c'est vraiment pas très grave. Je me contenterai de compter le nombre de messages et de comparer à ma liste de requêtes.

Merci beaucoup pour ces réponses

RB

#11 Général » affichages de messages dans pgadmin » 25/05/2010 10:33:55

rbidocho
Réponses : 3

Bonjour,

j'ai une liste d'environ 500 requêtes de mises à jour de colonnes à faire sur une base de 300GO.
A chaque fin de requête je fait un COMMIT pour voir dans l'onglet "messages" de pgadmin la situation.
A chaque fois, il m'affiche "ATTENTION: aucune transaction en cours"

La question est :
Est il possible de faire afficher (par ex.) : la requête "maj de la table/colonne machin/truc" a été réalisée"  dans la l'onglet messages de pgadmin ???

Cordialement,

RB

#12 Re : Général » Incrémentation fichier csv » 16/09/2009 09:16:34

OK et merci pour les réponses.

Question subsidiaire :

est ce possible avec pgadmin III car je ne suis vraiment pas à l'aise avec psql.

RB

#13 Re : Général » Incrémentation fichier csv » 15/09/2009 17:54:40

Pas si je découpe ma requête en plusieurs sous requêtes :

soit tb1, et tb2 les tables originales

select T1.a, sum(T1.b*T2.c)
from (select a, b from tb1 where a=e) T1, (select c, d from tb2 where d=e) T2
where T1.a=T2.d

et si je fais ça autant de fois que de valeurs e différentes. Cela devrait me donner 80 fichiers csv. Je pourrais les concaténer avec d'autres outils que postgresql mais si celui permet de rajouter des lignes à un fichier csv existant cela m'éviterait de passer par 15 outils différents.

merci

RB

#14 Re : Général » Incrémentation fichier csv » 15/09/2009 17:36:52

Ok merci.

donc je reviens à la question du départ : est il possible d'incrémenter des fichier csv ?

RB

ps : l'unicité avant la multiplication n'est pas possible à cause des relations entre les deux tables.

#15 Re : Général » Incrémentation fichier csv » 15/09/2009 16:36:11

Merci pour ce début de réponse.

En fait je travaille beaucoup (et exclusivement) avec pgadmin et quand et lance ma requête (sans le COPY), le serveur me répond au bout d'un moment :

ERREUR:  n'a pas pu écrire le bloc 7134534 du fichier temporaire : No space left on device
HINT:  Peut-être manquez-vous de place disque ?

ma requête est une multiplication entre 2 deux tables l'une faisant 176 millions de lignes et l'autre 4000 lignes : le résultats de la requête devrait faire 6 millions de lignes (agrégation des valeurs multipliées)

Je pense que le stockage en mémoire (ou sur le disque???) de la requête est trop grosse !!

si vous avez des idées ou si il faut que je dise des choses plus précises, dites le moi sans problème !!

RB

#16 Général » Incrémentation fichier csv » 15/09/2009 09:55:54

rbidocho
Réponses : 12

Bonjour,

alors, mon problème d'aujourd'hui est de pouvoir incrémenter un fichier csv. En effet, je ne peux pas créer le fichier d'un seul coup car ma requête dépasse la mémoire de mon serveur. Je voudrais alors "découper" ma requête et ainsi copier le résultat de chacune d'entre elle dans un seul et unique fichier csv.

Est ce possible ? et si oui comment ?

J'ai essayé de regarder du coté de la fonction COPY mais je ne vois rien qui se rattache à ma demande !!

Merci de votre aide,

Cordialement

RB

#17 Re : Général » Mise à jour d'une "grosse" table » 09/07/2009 10:59:57

rebonjour,

l'erreur viendrait de pgadmin qui ne supporte pas de réaliser quelques 36600 requêtes !!!

j'ai juste effectué ces requêtes en 3 fois.

merci encore de vos aides

RB

#18 Re : Général » Mise à jour d'une "grosse" table » 09/07/2009 09:51:11

Bonjour,

merci pour ces éclaircissements.

il est vrai que ma requêtes était fausse et je m'en suis rendu compte.
de plus pour essayer d'alléger le problème j'ai fais la requête suivante plusieurs milliers de fois d'affiler

UPDATE aaa as yy 
SET fe=xx.ef
FROM 
	(SELECT  em.c, em.s, em.r, em.n, em.p, em.e, em.fe, em.e/ac.a as ef 
	FROM bbb as ac, aaa as em 
	WHERE ac.c = em.c AND 
		  ac.s = em.s AND 
		  ac.r = em.r AND 
		  ac.n = em.n AND 
		  ac.c='01001') as xx 
WHERE xx.c = yy.c AND 
	  xx.s = yy.s AND 
	  xx.r = yy.r AND 
	  xx.n = yy.n AND 
	  xx.p = yy.p AND 
	  xx.c='01001';
COMMIT;

en changeant à chaque fois le '01001' par les valeurs successives possibles (36590 valeurs possibles).

mais cela à planter quand même au bout de la 10466 ème requête avec un code d'erreur :

ERROR:  out of memory
DETAIL:  Failed on request of size 1048576.

en regardant de plus près, il est vrai que j'ai des valeurs de ac.a qui sont égales à 0 mais elles n'ont pas ac.c, ac.s, ac.r, ac.n en lien dans la table à mettre à jour. Donc normalement, je n'ai jamais la division par 0.

le fait d'avoir mis COMMIT fait que la table à été mis à jour au mois pour les 10465 premières requêtes (i.e. valeurs de em.c ou ac.c)

Si vous avez des idées sur l'erreur précédemment citées !!!

Merci

RB

#19 Général » Mise à jour d'une "grosse" table » 08/07/2009 11:46:38

rbidocho
Réponses : 5

Bonjour,

j'ai une table aaa qui contient quelques 25 millions de lignes.
je voudrais faire un update de toutes les valeurs d'une colonne (f) via une opération avec des valeurs qui sont issues de 2 tables dont l'une est celle que je veux mettre à jour.

mais déjà quand je fais la "simple" requête suivante :

SELECT 
  aaa.e/bbb.a as f
FROM 
  public.bbb, 
  public.aaa
WHERE 
  bbb.c = aaa.c AND
  bbb.s = aaa.s AND
  bbb.r = aaa.r AND
  bbb.n = aaa.n;

pgadmin me réponds :

out of memory for query result

********** Erreur **********

la table aaa contient :
1 pk
2 fk
2 index

donc voici ce que je compte faire :

ALTER TABLE aaa DROP CONSTRAINT aaa_pkey;
ALTER TABLE aaa DROP CONSTRAINT aaa_p_fkey;
ALTER TABLE aaa DROP CONSTRAINT aaa_c_fkey;
ALTER TABLE aaa DROP CONSTRAINT aaa_c_key;
DROP INDEX ind_fk_bbb;
DROP INDEX ind_fk_u_1;

UPDATE bbb
INNER JOIN aaa 
ON (bbb.n = aaa.n) 
AND (bbb.r = aaa.r) 
AND (bbb.s = aaa.s) 
AND (bbb.c = aaa.c) 
SET aaa.f = aaa.e/bbb.a;

ALTER TABLE aaa
  ADD CONSTRAINT aaa_pkey PRIMARY KEY(c, s, r, n, p);
ALTER TABLE aaa
  ADD CONSTRAINT aaa_p_fkey FOREIGN KEY (p)
      REFERENCES u (p) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION;
ALTER TABLE aaa
  ADD CONSTRAINT aaa_c_fkey FOREIGN KEY (c, s, r, n)
      REFERENCES bbb (c, s, r, n) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION;
ALTER TABLE aaa
  ADD CONSTRAINT aaa_c_key UNIQUE(c, s, r, n, p);
CREATE INDEX ind_fk_bbb
  ON aaa
  USING btree
  (c, s, r, n);
CREATE INDEX ind_fk_u_1
  ON aaa
  USING btree
  (p);

Est ce que cela ne va pas planter en plein milieu ???
Ou peut on faire ce genre de maj par paquet ???

merci de vos contributions

RB

ps : config -->
postgresql 8.3.7
windows server 2003 r2
dell server pe2950
Intel Xeon CPU E5310 @ 1.60GHz
8 Go de Ram

#20 Re : Général » Transfert de tables de base à base ou dump en série » 08/07/2009 11:24:21

Bonjour,

bon ben j'y suis arrivé en faisant comme je l'ai dit dans mon dernier message. Le plus long a été de créer les requêtes avec le dblink (caractérisation de chaque champ).

Merci encore de vos lumières

RB

#21 Re : Général » Transfert de tables de base à base ou dump en série » 02/07/2009 12:33:33

Woua woua woua !!!

Entre temps j'avais commencé à réfléchir à quelque chose du genre (il faut en plus que je créé les contraintes et les index dans les tables de destination sachant qu'elles n'existent pas dans les tables sources) à faire pour toutes les tables

---------
-- xxx --
---------
DELETE FROM xxx;

INSERT INTO xxx(aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii, jjj, kkk)
    SELECT t1.aaa, t1.bbb, t1.ccc, t1.ddd, t1.eee, t1.fff, t1.ggg, t1.hhh, t1.iii, t1.jjj, t1.kkk
           FROM dblink('dbname=dbsource user=postgres password=pwd'::text, 
           'SELECT aaa, bbb, ccc, ddd, eee, fff, ggg, hhh, iii, jjj, kkk
	  FROM xxx'::text) t1(aaa serial, bbb bytea, ccc double precision, ddd character(30), eee character(50), fff double precision, ggg double precision, hhh integer, iii double precision, jjj double precision, kkk double precision);

ALTER TABLE xxx ALTER COLUMN aaa SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN bbb SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN ccc SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN ddd SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN eee SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN fff SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN ggg SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN hhh SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN iii SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN jjj SET NOT NULL;
ALTER TABLE xxx ALTER COLUMN kkk SET NOT NULL;

ALTER TABLE xxx ADD CONSTRAINT xxx_pkey PRIMARY KEY(aaa);
ALTER TABLE xxx ADD CONSTRAINT xxx_fff_fkey FOREIGN KEY (fff) REFERENCES yyy (fff) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION;
ALTER TABLE xxx ADD CONSTRAINT xxx_ccc_fkey FOREIGN KEY (ccc) REFERENCES zzz (ccc) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION;

CREATE UNIQUE INDEX idx_xxx ON xxx USING btree (aaa);

En attente de vos commentaires

Merci

RB

#22 Général » Transfert de tables de base à base ou dump en série » 02/07/2009 10:19:43

rbidocho
Réponses : 5

Bonjour,

voici la (les) question(s) du jour :

Je cherche à transférer des tables (une vingtaine) d'une base vers une autre. Sur ces 20 tables, une quinzaine existe déjà dans la base de destination, mais je veux remplacer les données --> existe t il une commande "simple" qui permet de supprimer les données de la table de destination puis de la reremplir avec les données de la table source (j'ai dblink d'installer) ?

pour les tables restantes (ou pour toutes les tables) , elles n'existe pas dans la base de destination et j'aimerai bien utiliser une commande qui ferait automatiquement les dump de chaque table pour les restaurer dans la base de destination.

pour info :

postgres 8.3.6 sur windows server 2003 rc2 avec pgadminIII 1.8.4

Je ne suis pas très à l'aise avec du pgsql alors si on pouvait le faire avec pgadmin

d'avance merci

RB

#24 Général » construction d'un nom de champ » 20/04/2009 14:26:28

rbidocho
Réponses : 2

Bonjour,

tout d'abord, milles excuses si cela n'est pas le bon forum, mais je ne voyais pas où poster ma question !!

Voilà mon problème :

je souhaiterais construire un nom de champ d'une table à partir d'un chaine de caractère (toujours la même) et du résultat d'une requête. Un truc du genre :

select 'pj'||(select n from tn where m=2) from tc; => select pj7 from tc => pj7=0.5

mais quand je fais ça, le résultat n'est pas la valeur du champ (0.5) mais le nom du champ (pj7).

comment peut on construire un nom de champ ??

cordialement,

RB

#25 Re : Général » requete multibase sur un même serveur avec pgadminIII » 12/02/2009 17:00:30

Merci,

je l'ai exécuter (dans chaque base) avec pgadminIII ne comprenant pas grand chose à la console pgsql !!

et Ô miracle ça fonctionne !!

Encore merci

Bonne Journée

RB

Pied de page des forums

Propulsé par FluxBB