Re: Ayuda con explain

From: "Jaime Casanova" <systemguards(at)gmail(dot)com>
To: "Jose Maria Mencia Fernandez" <jmencia(at)alimarket(dot)es>
Cc: "Martin Marques" <martin(at)bugs(dot)unl(dot)edu(dot)ar>, PostgreEs <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Ayuda con explain
Date: 2007-05-11 00:12:23
Message-ID: c2d9e70e0705101712j6fd21f55t8026a83e59458f1d@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On 5/9/07, Jose Maria Mencia Fernandez <jmencia(at)alimarket(dot)es> wrote:
> Ok, ejecuto con explain analyze ...
>
> y el resultado es:
>
> Hash Join (cost=85.60..120.13 rows=125 width=246) (actual
> time=9.298..19.990 rows=642 loops=1)
> Hash Cond: ("outer".id_filiacion = "inner".id_filiacion)
> -> Seq Scan on red_empresas emp (cost=0.00..30.07 rows=642
> width=220) (actual time=0.042..4.460 rows=642 loops=1)
> Filter: ((id_pais)::text = 'ESP'::text)
> -> Hash (cost=83.95..83.95 rows=659 width=30) (actual
> time=9.085..9.085 rows=662 loops=1)
> -> Seq Scan on com_filiaciones fil (cost=0.00..83.95 rows=659
> width=30) (actual time=0.029..5.586 rows=662 loops=1)
> Filter: es_empresa
> Total runtime: 22.831 ms
> (8 filas)
>
>

cuantos registros hay en cada una de las tablas?

> Casualmente la mayoría de los registros poseen id_pais = 'ESP', ¿ es por
> ello que el servidor decide aplicar Seq Scan en vez de usar índice?
>

efectivamente, un campo con muchos valores identicos y solo unos
cuantos distintos no es buen candidato para un indice (a menos que el
indice sea parcial where id_pais not in ('ESP'))

En cuanto al asunto de la correlacion... postgres guarda estadisticas
que le permiten estimar que cantidad de registros regresara para
condiciones como:
fil.es_empresa='TRUE' y emp.id_pais='ESP', pero en cambio le resulta
mucho mas dificil estimar que cantidad de los registros que regresa de
una tabla coinciden con los de la otra (emp.id_filiacion =
fil.id_filiacion).
...

Otro motivo por el que tu consulta se hace lenta, no se cuanto afecte,
es el hecho de que cada fila de la tabla red_empresas tiene 220 bytes
(efecto de la gran cantidad de columnas varchar(255) que quiza podrian
estar en otra tabla, por cierto porque varchar(tamaño) en vez de
text?). Eso limita la cantidad de registros que se leen en una sola
operacion de e/s. asi en vez de leer las 642 filas de golpe lo hara en
varias operaciones e/s y si ademas tienes tuplas muertas (falta de
vacuum suficientemente periodico) leerias muchas mas paginas de las
realmente necesarias. Claro solo estoy especulando aqui.

--
Atentamente,
Jaime Casanova

"Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs and the universe trying
to produce bigger and better idiots.
So far, the universe is winning."
Richard Cook

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2007-05-11 00:27:02 Re: Romper la normalizacion
Previous Message Gabriel Hermes Colina Zambra 2007-05-10 23:22:58 RE: 3 consultas sobre Funciones