Re: Problema de Performance

From: "Silvio Quadri" <silvioq(at)gmail(dot)com>
To: "Yasset Perez Riverol" <yasset(dot)perez(at)biocomp(dot)cigb(dot)edu(dot)cu>
Cc: "postgre sql" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problema de Performance
Date: 2008-01-30 08:44:02
Message-ID: 61dc71dc0801300044o3f027327q804b637de3764ac7@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2008/1/24, Yasset Perez Riverol <yasset(dot)perez(at)biocomp(dot)cigb(dot)edu(dot)cu>:
>
> Hola a todos :
> Estoy Construvyendo una aplicacion en java que se conecta a una base
> de
> datos en postgresql, el problema es el siguiente:
> Mi disehno relacional es este:
>
> Tabla 1
> atributo a (key)
> atributo b
> atributo c
>
> Tabla 2
> atributo a (key)
> atributo b
>
> Table 3
> atributo a (forein key the a Tabla 1)
> atributo b (Forein Key the a Tabla 2)
>
> hago un query de la forma
> select tabla1.a, tabla1.b, tabla1.c, tabla2.b
> from tabla1
> inner join tabla3 on (tabla1.a = tabla3.a)
> inner join tabla2 on (tabla3.b = tabla2.a)
>
> Ahora bien el query se demora alrededor de 10 min porque tengo 5 millones
> de
> records en a tabla 1 y 9 millones en la tabla de relacion 3.
>
> Alguna idea de como bajar este tiempo. (Maquina Dual AMD Athlon 2.4, 3 GB)
>
> Sldos Yasset
> --
> TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envía "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
>

SOLUCIÓN:
El inconveniente no estaba en el query en sí, ni en los tipos de datos, sino
en el contenido del campo id_tabla1 que se está usando para el join.
Según Yasset, este campo es del tipo VARCHAR, y tiene la forma XXXXNNNNNNNN.
Donde XXXX es un código alfabético y NNNNNNNN es un numérico rellenado con
ceros.
El problema radica en que la dispersión de los datos del parcial XXXX es
bajísima, y si adicionamos los ceros a la izquierda, nos encontramos que los
primeros 6 u 7 bytes de la clave es prácticamente la misma para los 5
millones de registros. Por esto, el motor decide no tener en cuenta estos
índices antes de devolver resultados.

Para salvar este inconveniente, se le agregó a la tabla3 y a la tabla1 un
campo del tipo int con el valor NNNNNNNN con sus respectivos índices. Ambos
índices quedaron con una gran dispersión (no poseo la información, pero
supongo que está en el orden del 95% o más) y se reescribió el query para
usar este campo como join.

El resultado fue que en este caso el motor decide utilizar los índices,
logrando bajar de 10 a 2 minutos el resultado de la consulta.

Habitualmente, me he encontrado con problemas de dispersión de este tipo en
índices, pero siempre en combinados (con más de un campo), donde el primer
campo tiene muy poca variabilidad, y siempre lo he solucionado invirtiendo
el orden de los campos en la declaración del índice.

TIP 999: Un índice con baja dispersión, es ocupar espacio inútilmente!

Saludos,
Silvio

--
Silvio Quadri

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel Rodríguez Penabad 2008-01-30 08:55:32 Re: comandos en postgresql
Previous Message Fabiola Fernández 2008-01-30 08:28:54 Re: El API pgsql en C