From: | Guillermo Villanueva <guillermovil(at)gmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
Cc: | Anita Ramirez <anita(dot)ins(at)gmail(dot)com>, Ayuda <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: [pgsql-es-ayuda] optimización de busqueda por like |
Date: | 2011-11-17 15:58:10 |
Message-ID: | CANm+PCBuh=L1OzVeEZQL9d3En=fbYjTQE3j2xMTZ2fWPPETDJQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
La tabla alumnos es una especialización de la tabla personas, como dice
Alvaro, Alumnos debería tener una clave foranea apuntando a la persona
correspondiente. Alumnos no debería tener los otros datos que ya están en
la tabla personas.
Guillermo Villanueva
El 16 de noviembre de 2011 13:05, Alvaro Herrera
<alvherre(at)alvh(dot)no-ip(dot)org>escribió:
>
> Excerpts from Anita Ramirez's message of mar nov 15 15:11:24 -0300 2011:
> > Buenas tardes,
> >
> > Resulta que tengo una función que realiza varias validaciones,
> inserciones
> > etc. Una de ellas es realizar búsqueda por like a una tabla. Básicamente
> > tengo dos tablas "alumno" y "persona", a cada alumno se debe buscar en
> la
> > tabla persona, y para ello solo contamos con nombres y apellidos (nombre
> > completo, es decir en un solo campo y campos separados, es decir nombre1,
> > nombre2, apellido1, apellido2),
>
> Eso me huele a mal diseño. ¿No debería haber una llave foránea en
> alumno que apunte a un registro específico en persona? Si cada alumno
> es también una persona, ¿qué sentido tiene almacenar los nombres y
> apellidos en alumno, que ya están en persona?
>
> > por lo que inicialmente procedemos a buscar
> > por "=", considerando mayusculas, minusculas, caracteres especiales, si
> eso
> > no emite resultado procedemos a buscar por like en los campos separados,
> y
> > si nuevamente no emite resultados, se realiza nuevamente la búsqueda por
> > like en el campo que contiene el nombre y apellido completo.
> >
> > La tabla persona en la que se realiza la búsqueda tiene aproximadamente
> > 580000 registros. Probé con indices btree, y también leí acerca de
> > varchar_pattern_ops, pero con éste ultimo no es posible utilizar "es
> > igual", por lo que no me resulta.
>
> Una idea simple sería tener dos índices, un btree normal y un btree con
> varchar_pattern_ops. Eso te permitiría usar búsquedas con LIKE y al
> mismo tiempo con =.
>
> > Tal cual como se encuentra ahora por 50 registros tarda 6 minutos
> > aproximadamente, lo cual es mas que excesivo.
>
> Hay algo muy mal en tu sistema.
>
> --
> Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>
From | Date | Subject | |
---|---|---|---|
Next Message | ruben avila galindo | 2011-11-17 16:11:47 | Cursores Vs Performance |
Previous Message | Guillermo Villanueva | 2011-11-17 15:50:51 | Re: Metodos para hacer select a una tabla |