From: | Leonardo Castillo <leonardo(dot)castillo(at)alejandria(dot)biz> |
---|---|
To: | pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Problema con borrado de tablas relacionadas. |
Date: | 2010-04-27 15:11:22 |
Message-ID: | t2wb84fac291004270811nbf6cc5a6qd6aebf8aeba235f1@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Buenos días amigos Listeros.
Acudo a ustedes con un problema que me está pateando fuertemente. Tengo
estas dos tablas relacionadas a través de un Foreign Key
CREATE TABLE titulos
(
cod_titulo numeric(8) NOT NULL,
titulo character varying(512),
caracter_orden numeric(4),
titulo_salida character varying(512),
CONSTRAINT pk_titulos PRIMARY KEY (cod_titulo)
)
CREATE INDEX titulo
ON titulos
USING btree
(titulo);
CREATE TABLE codtit
(
acceso character varying(13),
ext_acceso numeric(4),
cod_titulo numeric(8),
tipo_tit character varying(5),
portada character varying(1),
orden numeric(4),
tipo_doc character varying(8),
id_cod_titulo numeric(10) NOT NULL DEFAULT
nextval('codtit_id_cod_titulo_seq'::regclass),
CONSTRAINT pk_codtit PRIMARY KEY (id_cod_titulo),
CONSTRAINT fk_cod_titulo03 FOREIGN KEY (cod_titulo)
REFERENCES titulos (cod_titulo) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT,
CONSTRAINT idx_id_cod_titulo UNIQUE (id_cod_titulo)
)
-- Index: cod_titulo
-- DROP INDEX cod_titulo;
CREATE INDEX cod_titulo
ON codtit
USING btree
(cod_titulo);
-- Index: idx_codtitulo01
-- DROP INDEX idx_codtitulo01;
CREATE INDEX idx_codtitulo01
ON codtit
USING btree
(acceso, ext_acceso, cod_titulo, tipo_tit);
Perdonen la cantidad de SQL pero es para ilustrar mejor el ejemplo. La tabla
títulos posee 310.000 registros y la tabla codtit 370.000 registros. Estan
relacionados por la FK "fk_cod_titulo03", ahora bien si se desea hacer
DELETE FROM TITULOS WHERE cod_titulo = XXXXXXX y ese cod_titulo existe en la
tabla codtit, el manejador retorna error de clave foranea, lo cual está bien
pues en el ON DELETE está marcado como RESTRICT, pero si el cod_titulo no
está, el delete tarda 200 segundos, lo cual es un tiempo excesivo. Traté de
pedir explain de la consulta y el explain pasó de 1 hora y no dió resultado,
al cancerlo el pgsql me mostro esto: "SELECT 1 FROM ONLY "public"."codtit" x
WHERE "cod_titulo" = $1 FOR SHARE OF x". No entiendo porque esta situación
si el ya sabe que no existe registros referenciados.
Mucho le agradezco puedan ayudarme a clarificar la falla.
Atte.
Leonardo Castillo L.
From | Date | Subject | |
---|---|---|---|
Next Message | Edwin Quijada | 2010-04-27 15:15:40 | RE: Extranas caidas de Postgres |
Previous Message | Alvaro Herrera | 2010-04-27 15:03:37 | Re: Extranas caidas de Postgres |