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 25/10/2010 09:22:23

rbidocho
Membre

problème de création de tables

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

Hors ligne

#2 25/10/2010 09:58:53

Marc Cousin
Membre

Re : problème de création de tables

Peu probable. Ce que laisse entendre le message, c'est que vous avez exécuté plus de 2^32 (4 milliards) de commandes SQL dans cette même transaction. Il n'y aurait pas un problème dans votre script ?
Si vous voulez avancer, expliquez ce qu'il fait, ou postez son code.


Marc.

Hors ligne

#3 25/10/2010 10:09:43

rbidocho
Membre

Re : problème de création de tables

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

Hors ligne

#4 25/10/2010 10:22:12

Marc Cousin
Membre

Re : problème de création de tables

Ça ne correspond pas. Ce que vous me donnez ne génère que 3 commandes. Il doit y avoir autre chose.


Marc.

Hors ligne

#5 25/10/2010 10:39:54

rbidocho
Membre

Re : problème de création de tables

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

Hors ligne

#6 25/10/2010 10:58:07

Marc Cousin
Membre

Re : problème de création de tables

Je viens de comprendre:

Cela provient des contraintes FOREIGN KEY: chacune d'entre elle déclenche un ordre SQL implicite, pour vérifier l'intégrité. Le compte y est donc:
3 foreign keys * 50 tables * 30 millions d'enregistrements = 4,5 milliards de commandes SQL exécutées.

Pour résoudre votre problème (et que ça soit beaucoup plus rapide), je vous conseille d'ajouter les foreign keys APRÈS avoir mis les données dans les tables.

Dernière modification par Marc Cousin (25/10/2010 10:58:31)


Marc.

Hors ligne

#7 25/10/2010 11:03:53

rbidocho
Membre

Re : problème de création de tables

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 !!

Dernière modification par rbidocho (25/10/2010 11:18:48)

Hors ligne

#8 25/10/2010 12:17:35

Marc Cousin
Membre

Re : problème de création de tables

J'insiste. Vous irez vraisemblablement 100 fois plus vite en ne créant les contraintes et index qu'après la recopie.

Mais oui, un commit réglera le problème, même si c'est une mauvaise solution.


Marc.

Hors ligne

#9 25/10/2010 13:23:25

rbidocho
Membre

Re : problème de création de tables

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


merci beaucoup

RB

Hors ligne

Pied de page des forums