[AYUDA] Queries de caracteres acentuados en Postgres
Ixcoatl Perez
ixcoatl.perez.de.la.b en gmail.com
Lun Abr 4 16:55:50 CDT 2011
Si, asi es.
Lo que queria decir es la velocidad de ejecucion por cada registro es
comprable a la de un 'like' , por decir algo. Ambos tienen que hacer
sustituciones internas de un buffer en la memoria para cada llamada a
la funcion.
Asi las cosas tu programa puede ser que no se vea afectado grandemente
por esta situacion.
De cualquier manera, si estas hablando de sacar millones de registros
de una tabla, la transposicion de unos cuantos bytes sera el menor de
tus cuellos de botella.
Saludos
El día 4 de abril de 2011 16:50, Gustavo Guillermo Perez
<gustavo en compunauta.com> escribió:
> El Lunes 04 Abril 2011, Ixcoatl Perez escribió:
>> Esta opcion:
>>
>> CREATE OR REPLACE FUNCTION asciify(unicode text) RETURNS text AS $$
>> DECLARE
>> translated text;
>> BEGIN
>> translated := '';
>> FOR i in 1..(char_length(unicode)) LOOP
>> translated := translated || chr(ascii(substring(unicode,i,1))%128);
>> END LOOP;
>> RETURN translated;
>> END;
>> $$ LANGUAGE plpgsql;
>>
>> No es mala porque en realidad el codigo no se interpreta cada vez que
>> se hace la comparacion. Cuando creas la funcion se compila y se guarda
>> en codigo objeto (o posiblemente maquina), haciendo que su ejecucion
>> sea tan rapida como las funciones nativas.
> Si se ejecuta por cada comparación, ya que si tienes almacenado algo con
> acento en una tabla y usan o no usan acentos en tu búsqueda estás forzado a
> pasar la función por cada registro para sustituir los caracteres especiales
> antes de comparar.
>
>> No la haz probado?
>>
>> Saludos!
>>
>>
>> El día 4 de abril de 2011 16:42, Gustavo Guillermo Perez
>>
>> <gustavo en compunauta.com> escribió:
>> > El Lunes 04 Abril 2011, escribió:
>> >> Que tal Gustavo,
>> >>
>> >> Nuestro problema es que usamos realmente muchos constraints en las
>> >> tablas, y MySQL simplemente se arrana cual vaca en medio de la
>> >> carretera con estas características.
>> >>
>> >> Por ejemplo, acabo de implementar la función:
>> >>
>> >> CREATE OR REPLACE FUNCTION sp_ascii(character varying)
>> >> RETURNS text AS
>> >> $BODY$
>> >> SELECT TRANSLATE
>> >> ($1,
>> >> 'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',
>> >> 'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');
>> >> $BODY$
>> >> LANGUAGE 'sql' IMMUTABLE;
>> >>
>> >> La cual sustituye todo caracter acentuado, tanto en la cadena de búsquda
>> >> como en el campo en el cual se realiza la misma. Posteriormente, creando
>> >> el índice (que termina en más de 10 minutos porque la tabla tiene casi
>> >> 12 millones de registros):
>> >>
>> >> CREATE INDEX ksp_ascii_lastname ON clients (lower(sp_ascii(lastname)));
>> >>
>> >> Para aventarle el query:
>> >>
>> >> SELECT * FROM clients WHERE lower(sp_ascii(lastname)) LIKE
>> >> lower(sp_ascii('pérez'));
>> >>
>> >> Que me responde (en casi dos minutos):
>> >>
>> >> '47168 rows found'
>> >>
>> >> .... Esto no suena a una respuesta profesional aceptable. Pero tengo la
>> >> esperanza de poder hacer un tuning a Postgres.
>> >>
>> >> Algun tip al respecto?. Saludos.-
>> >
>> > Claro que sí, es opensource, puedes modificar el código fuente en C para
>> > que te transforme las comparaciones, por una función tuya que sustituya
>> > la de simplemente ==, eso te daría muchísima velocidad y podrías ponerlo
>> > como una opción en postgresql a la hora de construirlo y hacer público
>> > el parche.!!! esa es la idea de que postgresql y mysql son opensource,
>> > que puedes modificarlos.!!!!
>> >
>> > Respecto a los constraints, MySQL tiene varios drivers internos de
>> > almacenamiento y no todos lo soportan es cierto eso no quiere decir que
>> > no tenga soporte, al crear las tablas uno elije que tipo de storage,
>> > sabiendo pro/cons puedes elegir entre velocidad/journaling/constraints
>> > etc.
>> >
>> > para hacer esto te recomendaría buscar una biblioteca común de utf8 para
>> > que conviertas las cadenas a utf8, luego las pases a minúsculas a ambas
>> > y por último antes de hacer la comparación, reemplazar íÍïÏì por i antes
>> > de ejecutar ==.
>> > También deberías modificar las funciones que actualizan y modifican el
>> > índice para indexar las versiones minúsculas y con los caracteres
>> > convertidos, siendo que no vas a alterar el registro original, solo la
>> > versión del char con el que indexas y comparas.
>> >
>> > Saludos.
>> >
>> >> > From: gustavo en compunauta.com
>> >> > To: ayuda-linux en googlegroups.com
>> >> > Subject: Re: [AYUDA] Queries de caracteres acentuados en Postgres
>> >> > Date: Mon, 4 Apr 2011 15:50:42 -0500
>> >> >
>> >> > El Lunes 04 Abril 2011, escribió:
>> >> > > Que tal estimadísimos,
>> >> > >
>> >> > > Mi duda con Postgres 8.4, es cómo diablos puedo ejecutar un select,
>> >> > > donde un campo (p.e: nombre) conincida con 'maría' y me arroje los
>> >> > > resultados:
>> >> > >
>> >> > > MARIA
>> >> > > MARÍA
>> >> > > maria
>> >> > > maría
>> >> >
>> >> > tal vez con SIMILAR TO.
>> >> >
>> >> > > Alguien ya resolvió esto en postgres?
>> >> >
>> >> > Te recomiendo que si tu proyecto es nuevo lo analices, alomejor no te
>> >> > conviene utilizar postgresql sino MySQL, no estoy a favor de uno o del
>> >> > otro, sino que mysql en tu caso encuentra con 'maria' todos tus casos
>> >> > como los listaste.
>> >> >
>> >> > Saludos.
>> >> >
>> >> > > Saludos y gracias de antemano.
>> >
>> > --
>> > Gustavo Guillermo Perez
>> > http://www.compunauta.com
>> > http://www.compunauta.net
>> > http://anuncios.compunauta.net
>> >
>> > --
>> > Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"
>> > de Grupos de Google.
>> > Si quieres publicar en este grupo, envía un mensaje de correo
>> > electrónico a ayuda-linux en googlegroups.com
>> > Para anular la suscripción a este grupo, envía un mensaje a
>> > ayuda-linux-unsubscribe en googlegroups.com
>> > Para obtener más opciones, visita este grupo en
>> > http://groups.google.es/group/ayuda-linux?hl=es. o
>> > http://www.compunauta.com/ayuda/
>
>
> --
> Gustavo Guillermo Perez
> http://www.compunauta.com
> http://www.sendadevida.org
> http://anuncios.compunauta.net
>
> --
> Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"
> de Grupos de Google.
> Si quieres publicar en este grupo, envía un mensaje de correo
> electrónico a ayuda-linux en googlegroups.com
> Para anular la suscripción a este grupo, envía un mensaje a
> ayuda-linux-unsubscribe en googlegroups.com
> Para obtener más opciones, visita este grupo en
> http://groups.google.es/group/ayuda-linux?hl=es. o http://www.compunauta.com/ayuda/
--
Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"
de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a ayuda-linux en googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
ayuda-linux-unsubscribe en googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.es/group/ayuda-linux?hl=es. o http://www.compunauta.com/ayuda/
Más información sobre la lista de distribución Ayuda