Re: [pgsql-es-ayuda] optimización de busqueda por like

From: Anita Ramirez <anita(dot)ins(at)gmail(dot)com>
To: Cesar Erices <caerices(at)gmail(dot)com>
Cc: POSTGRES <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] optimización de busqueda por like
Date: 2011-11-17 17:04:01
Message-ID: CAH0STeMGC6PCmXMn-0VAS8kK+-C3tqnbKCUrHxZbh5LRci2n5A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Les explico basicamente el escenario. Los datos de alumnos son resultado de
planillas de calificaciones de entidades educativas que fueron
digitalizadas, mediante reconocimiento OCR se colocaron los datos de los
mismos en tablas temporales (en este caso alumno), en la BD provista por el
cliente (en la cual se encuentra la tabla persona) debemos ubicar dichos
alumnos, es por ello que no tenemos un id asociado entre alumno y persona,
y, necesariamente debe de buscarse por nombre/apellidos.

Esas tablas temporales resultantes de las planillas las colocamos en la BD
provista por el cliente, pero dentro de otro esquema.

En cuanto a migrar a la versión 9, no es una opción ya que el cliente tiene
otros datos para otros sistemas en el mismo servidor y por el momento no
quieren tocarlo por ello se encuentra con la versión 8.4.

La consulta sería algo como :

select id_persona from persona where coalesce(primer_nombre, '') like
'%'||nombre1||'%' and
coalesce(segundo_nombre, '') like
'%'||nombre2||'%' and
coalesce(primer_apellido, '') like
'%'||apellido1||'%' and
coalesce(segundo_apellido, '') like
'%'||apellido2||'%'
and numero_persona =cedula;

Las características del servidor (se encuentra virtualizado):
SO: Red Hat 5
Memoria: 10GB
Proc: 6 núcleos

Gracias por sus aportes, voy a probar con ambos indices, el btree y
varchar_pattern_ops, asi como tambien la opción de expresiones regulares.

Saludos,

Se digitalizaron planillas de calificaciones, y los datos encontrados en
dichas planillas se almacenaron en una BD temporal )
El 16 de noviembre de 2011 12:22, Cesar Erices <caerices(at)gmail(dot)com>escribió:

> El 15 de noviembre de 2011 14:11, Anita Ramirez <anita(dot)ins(at)gmail(dot)com>escribió:
>
>
>> 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), 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.
>>
>> Tal cual como se encuentra ahora por 50 registros tarda 6 minutos
>> aproximadamente, lo cual es mas que excesivo.
>>
>> Alguna idea?
>>
>> Desde ya, gracias.
>>
>> Ana Ramirez.-
>>
>
> Revisa los indices y pk, habitualmente esto se produce por un ml diseño de
> BBDD
>
> atte.
>
> --
> Sin más que decir se despide de Usted, muy atentamente
>
> Cesar Erices Vergara
> Ingeniero en Gestión Informática
> Analista de Sistema
>
> Santiago - Chile
>

--
Ana Ramirez.-

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Kernel 2011-11-17 17:09:34 Re: extraer las horas o minutos totales de un interval
Previous Message ruben avila galindo 2011-11-17 16:51:45 Re: Cursores Vs Performance