[Pgsql-ayuda] Tiempo de respuesta

Alvaro Herrera alvherre@dcc.uchile.cl
Thu, 25 Sep 2003 18:38:02 -0400


On Thu, Sep 25, 2003 at 05:13:42PM -0400, Patricio Muñoz wrote:
> 
> > El jue, 25-09-2003 a las 21:26, Patricio Muñoz escribió:
> > > Tengo una tabla con  2.063.478 de registros. Al ejecutar la
> > > consulta por ej.
> > > SELECT * FROM particular WHERE telefono LIKE '00%960766' AND
> > > region='05';
> > > [...]
> > > De que manera puedo bajar el tiempo de respuesta ?

> > ¿Tienes algún índice en la tabla?
>     Si, en campo telefono
> >¿Los teléfonos empiezan por números muy diferentes o todos comienzan
> >por '00'?
> Todos comienzan por '00'

Hmm... es dificil hacer una busqueda de indice de esa manera.
Generalmente el sistema hace un seqscan porque la busqueda de indice no
puede satisfacer las condiciones.

Dado que no tienes un % al final, puede decirse que la condición de
búsqueda está anclada al final del número telefónico.  En tal caso
podrías crear un índice funcional en el reverso del teléfono.  Digamos
algo como

create index rev_telefono on particular rev(telefono);

donde rev(telefono) es una funcion strict (o quizas immutable, no
recuerdo bien) que devuelve el telefono invertido, es decir para el
número 092819328 devuelva 823918290.  Lo mejor sería hacer esta función
en C por rendimiento (aunque para probar la idea podrías partir con
PL/perl, debería ser trivial).

Luego haces la búsqueda de la siguiente manera:

SELECT * FROM particular WHERE telefono LIKE rev('667069%00') AND region='05';
(nota que el teléfono está invertido).

Esto es teoría; no lo he probado, pero _debería_ funcionar.  El problema
es que limita a los teléfonos que _terminan_ de una manera fija.


Si esta solución no es suficientemente general, es posible que tengas
que desarrollar un índice GiST.  No debería ser difícil, pero en ningún
caso trivial.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"La persona que no quería pecar / estaba obligada a sentarse
en duras y empinadas sillas    / desprovistas, por cierto
de blandos atenuantes"                          (Patricio Vogel)