Re: Problema con borrado de tablas relacionadas.

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

Buenas tardes Sr. Alvaro

Le comento las pruebas que he realizado:

PREPARE codtitprueba2 (int) AS
SELECT 1 FROM ONLY "public"."codtit" WHERE "codtit"."cod_titulo" = $1 FOR
SHARE;
EXPLAIN ANALYZE EXECUTE codtitprueba2(310141);

No terminó luego de 6 minutos

PREPARE codtitprueba (int) AS
SELECT 1 FROM ONLY "public"."codtit",titulos WHERE "codtit"."cod_titulo" =
$1 FOR SHARE OF titulos;
EXPLAIN ANALYZE EXECUTE codtitprueba(310141);

Aquí presiento que me equivoque pues sustitui mi tabla por la x. Este si
respondió

"Nested Loop (cost=11574.40..42321.82 rows=1235052 width=6) (actual
time=0.094..8154.934 rows=308763 loops=1)"
" -> Index Scan using cod_titulo on codtit (cost=0.00..14.39 rows=4
width=0) (actual time=0.038..0.044 rows=1 loops=1)"
" Index Cond: (cod_titulo = ($1)::numeric)"
" -> Materialize (cost=11574.39..16170.02 rows=308763 width=6) (actual
time=0.050..7766.948 rows=308763 loops=1)"
" -> Seq Scan on titulos (cost=0.00..9757.63 rows=308763 width=6)
(actual time=0.041..6392.791 rows=308763 loops=1)"
"Total runtime: 19205.946 ms"

Algo que me surge como duda es, el primero que no terminó es un SELECT sobre
una tabla plana. Que recomendaciones me hacen por favor?. Ya hice VACUMM
ANALYZE de la bd completa. Recrear la tabla con otro nombre y luego volver a
su nombre original, tanto de titulos como codtit.

Gracias de antemano.

Atte.
Leonardo Castillo L.

El 27 de abril de 2010 14:56, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>escribió:

> 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 Jaime Casanova 2010-04-27 20:01:23 Re: Problema con borrado de tablas relacionadas.
Previous Message Alvaro Herrera 2010-04-27 19:26:13 Re: Problema con borrado de tablas relacionadas.