Re: Problema con borrado de tablas relacionadas.

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Leonardo Castillo <leonardo(dot)castillo(at)alejandria(dot)biz>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problema con borrado de tablas relacionadas.
Date: 2010-04-27 19:26:13
Message-ID: 20100427192613.GH5237@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Leonardo Castillo escribió:

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

Hmm, normalmente esta lentitud viene porque no puede usar un índice para
satisfacer la condición de la llave foránea; esa consulta se usa
internamente para hacer el chequeo de esa FK. Por ejemplo puede ser que
el índice no existe. Sin embargo en tu caso el índice está definido,
así que debe estar pasando alguna otra cosa. Así sin más yo no veo por
qué podría pasar esto. Los tipos de datos parecen coincidir bien. (Un
ejercicio sencillo sería recrear las tablas y poblarlas para probar,
pero lo dejaré para algún listero con más tiempo libre).

Investiga qué tan rápido puede contestar consultas del tipo que muestra
SELECT FOR SHARE, para valores de cod_titulo que existen y que no
existen (en particular prueba con el valor que se demora 200 segundos).
Asegúrate de probar con PREPARE y luego EXPLAIN ANALYZE EXECUTE para
pasar el valor de $1.

--
Alvaro Herrera http://www.advogato.org/person/alvherre
"We're here to devour each other alive" (Hobbes)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Leonardo Castillo 2010-04-27 20:01:10 Re: Problema con borrado de tablas relacionadas.
Previous Message Ernesto Quiñones 2010-04-27 18:27:55 PostgrESQL 9 Beta el Lunes 3 de Mayo