Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
Ç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
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
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
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
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
OK j'ai refait les requêtes en déplaçant les fk et les index en fin.
merci beaucoup
RB
Hors ligne
Pages : 1