[AYUDA] Queries de caracteres acentuados en Postgres
Gustavo Guillermo Perez
gustavo en compunauta.com
Lun Abr 4 17:06:22 CDT 2011
El Lunes 04 Abril 2011, Ixcoatl Perez escribió:
> 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.
Por ello insisto que si modificas la función de postgresql que hace el índice
y lo haga con los valores reemplazados mientras se insertan, y que la
comparación reemplace en el núcleo de postgresql los valores de búsqueda y por
registro no tendrías que llamar a una función que te aseguro que por ser un
procedimiento embebido debe hacer más de 3 function calls por registro.
:p
> 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/
--
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/
Más información sobre la lista de distribución Ayuda