[Pgsql-ayuda] Tiempo de respuesta

Patricio Muñoz pmunoz@cmet.net
Tue, 30 Sep 2003 16:58:31 -0400


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

Ya resolvi en parte el problema, por ejemplo el numero '0022814355', donde
02 es el codigo de ciudad (en este caso Santiago). Como medida lo que se
hizo fue separar el codigo de area y el telefono en 2 columnas, luego se
crea el indice para el campo telefono.
Fue como el despertar, la respuesta es menor a 1 segundo ;-)
El problema estaba en el diseño de la tabla

saludos y gracias por las posibles soluciones