<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'>
El problema, en términos de costo está más o menos así;<br><br>- en una tabla normal con casi 12'000,000 de registros con 195 campos ...<br><br>query con regexp: 246698 milisegundos<br>query normal: 2379 milisegundos<br><br>Digamos que el punto es desde luego, encontrar las tuplas correspondientes, más sin embargo es factor desicivo encontrarlas en mucho menor tiempo.<br><br>Snowball, pg_ascii(lower('cadena')), tsearch2 ... se fueron con sus zapatillas de ballet. <br><br>Ya terminé con la compilación de ICU, que es una dependencia para pg_collkey en la recompilación de postgres. Les cuento a ver que tal.<br><br>Saludos.<br><br><br><br><br>> Date: Mon, 4 Apr 2011 22:24:00 -0500<br>> Subject: Re: [AYUDA] Queries de caracteres acentuados en Postgres<br>> From: ixcoatl.perez.de.la.b@gmail.com<br>> To: ayuda-linux@googlegroups.com<br>> <br>> La opcion de Paynalton es la que mas me gusta.<br>> <br>> Es extremadamente facil de implementar del lado del cliente o servidor<br>> y en cualquier lenguaje.<br>> No necesitas mas que las vocales si usas un like y por supuesto, los<br>> numeros son solo un lujo (A = 4).<br>> <br>> Lo malo es que las expresiones regulares cuestan CPU, y son caras ! :D<br>> Pero la trivialidad de la solucion lo justifica.<br>> <br>> <br>> <br>> Saludos<br>> <br>> <br>> El día 4 de abril de 2011 22:14, Paynalton <cxescalona@gmail.com> escribió:<br>> > mmm, pero con regexp, la busqueda maria quedaría convertida a:<br>> > select * from tabla where nombre similar to [mM][aAáÁäÄ][rR][iIíÍïÏ][aAáÁäÄ]<br>> > lo cual haría match con:<br>> > María<br>> > maria<br>> > Marïa<br>> > mARIA<br>> > incluso podrías poner:<br>> > [mM][aAáÁäÄ4][rR][iIíÍïÏ1][aAáÁäÄ4]<br>> > y coinsidiría con:<br>> > M4r14<br>> > Por eso me encantan las expresiones regulares jejjeje.<br>> > Si un ave no rompe su huevo morirá antes de nacer.<br>> > Nosotros somos el ave y el mundo es nuestro huevo.<br>> > POR LA REVOLUCIÓN DEL MUNDO!!!!<br>> ><br>> > Ciudad de México<br>> ><br>> ><br>> > El 4 de abril de 2011 19:16, Mario Benitez <mariobenitez@hotmail.com><br>> > escribió:<br>> >><br>> >> Pudiera ser, pero por ejemplo<br>> >><br>> >> Si la cadena de búsqueda es 'maría', y en la cual se sustituye 'í' por<br>> >> 'i', si tendremos de regreso los resultados:<br>> >><br>> >> maría<br>> >> MARÍA<br>> >> María<br>> >> maria<br>> >><br>> >> ... peeeero, si la cadena de búsqueda es 'maria', no habrá nada<br>> >> sustituíble, por lo que los resultados de la búsqueda serán:<br>> >><br>> >> maria<br>> >><br>> >> Ahora estoy probando habilitar TSearch2 en postgres. Les cuento a ver que<br>> >> tal.<br>> >><br>> >> Saludos.<br>> >><br>> >> ________________________________<br>> >> From: cxescalona@gmail.com<br>> >> Date: Mon, 4 Apr 2011 18:29:08 -0500<br>> >> Subject: Re: [AYUDA] Queries de caracteres acentuados en Postgres<br>> >> To: ayuda-linux@googlegroups.com<br>> >><br>> >> oye, y no podrás usar acaso un regexp para refinar tus búsquedas??<br>> >><br>> >> http://www.postgresql.org/docs/8.3/static/functions-matching.html<br>> >><br>> >> segun esto puedes usar la función similar to:<br>> >><br>> >> select * from tabla where nombre similar to maria<br>> >><br>> >><br>> >> que además soporta expresiones regulares<br>> >><br>> >><br>> >> si así solo no te funciona puedes por ejemplo a tu cadena de búsqueda<br>> >> reemplazarle cada caracter por una regla como a="[aAáÁäÁ]" m="[mM]" y así<br>> >> antes de integrarla a tu query, ademásde convertirla a la codificación de<br>> >> carácteres que estes manejando en tus tablas.<br>> >><br>> >> Si un ave no rompe su huevo morirá antes de nacer.<br>> >> Nosotros somos el ave y el mundo es nuestro huevo.<br>> >> POR LA REVOLUCIÓN DEL MUNDO!!!!<br>> >><br>> >> Ciudad de México<br>> >><br>> >><br>> >> El 4 de abril de 2011 17:06, Gustavo Guillermo Perez<br>> >> <gustavo@compunauta.com> escribió:<br>> >><br>> >> El Lunes 04 Abril 2011, Ixcoatl Perez escribió:<br>> >> > Si, asi es.<br>> >> ><br>> >> > Lo que queria decir es la velocidad de ejecucion por cada registro es<br>> >> > comprable a la de un 'like' , por decir algo. Ambos tienen que hacer<br>> >> > sustituciones internas de un buffer en la memoria para cada llamada a<br>> >> > la funcion.<br>> >> ><br>> >> > Asi las cosas tu programa puede ser que no se vea afectado grandemente<br>> >> > por esta situacion.<br>> >> ><br>> >> > De cualquier manera, si estas hablando de sacar millones de registros<br>> >> > de una tabla, la transposicion de unos cuantos bytes sera el menor de<br>> >> > tus cuellos de botella.<br>> >> Por ello insisto que si modificas la función de postgresql que hace el<br>> >> índice<br>> >> y lo haga con los valores reemplazados mientras se insertan, y que la<br>> >> comparación reemplace en el núcleo de postgresql los valores de búsqueda y<br>> >> por<br>> >> registro no tendrías que llamar a una función que te aseguro que por ser<br>> >> un<br>> >> procedimiento embebido debe hacer más de 3 function calls por registro.<br>> >><br>> >> :p<br>> >> > Saludos<br>> >> ><br>> >> > El día 4 de abril de 2011 16:50, Gustavo Guillermo Perez<br>> >> ><br>> >> > <gustavo@compunauta.com> escribió:<br>> >> > > El Lunes 04 Abril 2011, Ixcoatl Perez escribió:<br>> >> > >> Esta opcion:<br>> >> > >><br>> >> > >> CREATE OR REPLACE FUNCTION asciify(unicode text) RETURNS text AS $$<br>> >> > >> DECLARE<br>> >> > >> translated text;<br>> >> > >> BEGIN<br>> >> > >> translated := '';<br>> >> > >> FOR i in 1..(char_length(unicode)) LOOP<br>> >> > >> translated := translated ||<br>> >> > >> chr(ascii(substring(unicode,i,1))%128); END LOOP;<br>> >> > >> RETURN translated;<br>> >> > >> END;<br>> >> > >> $$ LANGUAGE plpgsql;<br>> >> > >><br>> >> > >> No es mala porque en realidad el codigo no se interpreta cada vez que<br>> >> > >> se hace la comparacion. Cuando creas la funcion se compila y se<br>> >> > >> guarda<br>> >> > >> en codigo objeto (o posiblemente maquina), haciendo que su ejecucion<br>> >> > >> sea tan rapida como las funciones nativas.<br>> >> > ><br>> >> > > Si se ejecuta por cada comparación, ya que si tienes almacenado algo<br>> >> > > con<br>> >> > > acento en una tabla y usan o no usan acentos en tu búsqueda estás<br>> >> > > forzado<br>> >> > > a pasar la función por cada registro para sustituir los caracteres<br>> >> > > especiales antes de comparar.<br>> >> > ><br>> >> > >> No la haz probado?<br>> >> > >><br>> >> > >> Saludos!<br>> >> > >><br>> >> > >><br>> >> > >> El día 4 de abril de 2011 16:42, Gustavo Guillermo Perez<br>> >> > >><br>> >> > >> <gustavo@compunauta.com> escribió:<br>> >> > >> > El Lunes 04 Abril 2011, escribió:<br>> >> > >> >> Que tal Gustavo,<br>> >> > >> >><br>> >> > >> >> Nuestro problema es que usamos realmente muchos constraints en las<br>> >> > >> >> tablas, y MySQL simplemente se arrana cual vaca en medio de la<br>> >> > >> >> carretera con estas características.<br>> >> > >> >><br>> >> > >> >> Por ejemplo, acabo de implementar la función:<br>> >> > >> >><br>> >> > >> >> CREATE OR REPLACE FUNCTION sp_ascii(character varying)<br>> >> > >> >> RETURNS text AS<br>> >> > >> >> $BODY$<br>> >> > >> >> SELECT TRANSLATE<br>> >> > >> >> ($1,<br>> >> > >> >> 'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',<br>> >> > >> >> 'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');<br>> >> > >> >> $BODY$<br>> >> > >> >> LANGUAGE 'sql' IMMUTABLE;<br>> >> > >> >><br>> >> > >> >> La cual sustituye todo caracter acentuado, tanto en la cadena de<br>> >> > >> >> búsquda como en el campo en el cual se realiza la misma.<br>> >> > >> >> Posteriormente, creando el índice (que termina en más de 10<br>> >> > >> >> minutos<br>> >> > >> >> porque la tabla tiene casi 12 millones de registros):<br>> >> > >> >><br>> >> > >> >> CREATE INDEX ksp_ascii_lastname ON clients<br>> >> > >> >> (lower(sp_ascii(lastname)));<br>> >> > >> >><br>> >> > >> >> Para aventarle el query:<br>> >> > >> >><br>> >> > >> >> SELECT * FROM clients WHERE lower(sp_ascii(lastname)) LIKE<br>> >> > >> >> lower(sp_ascii('pérez'));<br>> >> > >> >><br>> >> > >> >> Que me responde (en casi dos minutos):<br>> >> > >> >><br>> >> > >> >> '47168 rows found'<br>> >> > >> >><br>> >> > >> >> .... Esto no suena a una respuesta profesional aceptable. Pero<br>> >> > >> >> tengo<br>> >> > >> >> la esperanza de poder hacer un tuning a Postgres.<br>> >> > >> >><br>> >> > >> >> Algun tip al respecto?. Saludos.-<br>> >> > >> ><br>> >> > >> > Claro que sí, es opensource, puedes modificar el código fuente en C<br>> >> > >> > para que te transforme las comparaciones, por una función tuya que<br>> >> > >> > sustituya la de simplemente ==, eso te daría muchísima velocidad y<br>> >> > >> > podrías ponerlo como una opción en postgresql a la hora de<br>> >> > >> > construirlo y hacer público el parche.!!! esa es la idea de que<br>> >> > >> > postgresql y mysql son opensource, que puedes modificarlos.!!!!<br>> >> > >> ><br>> >> > >> > Respecto a los constraints, MySQL tiene varios drivers internos de<br>> >> > >> > almacenamiento y no todos lo soportan es cierto eso no quiere decir<br>> >> > >> > que no tenga soporte, al crear las tablas uno elije que tipo de<br>> >> > >> > storage, sabiendo pro/cons puedes elegir entre<br>> >> > >> > velocidad/journaling/constraints etc.<br>> >> > >> ><br>> >> > >> > para hacer esto te recomendaría buscar una biblioteca común de utf8<br>> >> > >> > para que conviertas las cadenas a utf8, luego las pases a<br>> >> > >> > minúsculas<br>> >> > >> > a ambas y por último antes de hacer la comparación, reemplazar<br>> >> > >> > íÍïÏì<br>> >> > >> > por i antes de ejecutar ==.<br>> >> > >> > También deberías modificar las funciones que actualizan y modifican<br>> >> > >> > el<br>> >> > >> > índice para indexar las versiones minúsculas y con los caracteres<br>> >> > >> > convertidos, siendo que no vas a alterar el registro original, solo<br>> >> > >> > la<br>> >> > >> > versión del char con el que indexas y comparas.<br>> >> > >> ><br>> >> > >> > Saludos.<br>> >> > >> ><br>> >> > >> >> > From: gustavo@compunauta.com<br>> >> > >> >> > To: ayuda-linux@googlegroups.com<br>> >> > >> >> > Subject: Re: [AYUDA] Queries de caracteres acentuados en<br>> >> > >> >> > Postgres<br>> >> > >> >> > Date: Mon, 4 Apr 2011 15:50:42 -0500<br>> >> > >> >> ><br>> >> > >> >> > El Lunes 04 Abril 2011, escribió:<br>> >> > >> >> > > Que tal estimadísimos,<br>> >> > >> >> > ><br>> >> > >> >> > > Mi duda con Postgres 8.4, es cómo diablos puedo ejecutar un<br>> >> > >> >> > > select, donde un campo (p.e: nombre) conincida con 'maría' y<br>> >> > >> >> > > me<br>> >> > >> >> > > arroje los resultados:<br>> >> > >> >> > ><br>> >> > >> >> > > MARIA<br>> >> > >> >> > > MARÍA<br>> >> > >> >> > > maria<br>> >> > >> >> > > maría<br>> >> > >> >> ><br>> >> > >> >> > tal vez con SIMILAR TO.<br>> >> > >> >> ><br>> >> > >> >> > > Alguien ya resolvió esto en postgres?<br>> >> > >> >> ><br>> >> > >> >> > Te recomiendo que si tu proyecto es nuevo lo analices, alomejor<br>> >> > >> >> > no<br>> >> > >> >> > te conviene utilizar postgresql sino MySQL, no estoy a favor de<br>> >> > >> >> > uno o del otro, sino que mysql en tu caso encuentra con 'maria'<br>> >> > >> >> > todos tus casos como los listaste.<br>> >> > >> >> ><br>> >> > >> >> > Saludos.<br>> >> > >> >> ><br>> >> > >> >> > > Saludos y gracias de antemano.<br>> >> > >> ><br>> >> > >> > --<br>> >> > >> > Gustavo Guillermo Perez<br>> >> > >> > http://www.compunauta.com<br>> >> > >> > http://www.compunauta.net<br>> >> > >> > http://anuncios.compunauta.net<br>> >> > >> ><br>> >> > >> > --<br>> >> > >> > Has recibido este mensaje porque estás suscrito a Grupo<br>> >> > >> > "ayuda-linux"<br>> >> > >> > de Grupos de Google.<br>> >> > >> > Si quieres publicar en este grupo, envía un mensaje de correo<br>> >> > >> > electrónico a ayuda-linux@googlegroups.com<br>> >> > >> > Para anular la suscripción a este grupo, envía un mensaje a<br>> >> > >> > ayuda-linux-unsubscribe@googlegroups.com<br>> >> > >> > Para obtener más opciones, visita este grupo en<br>> >> > >> > http://groups.google.es/group/ayuda-linux?hl=es. o<br>> >> > >> > http://www.compunauta.com/ayuda/<br>> >> > ><br>> >> > > --<br>> >> > > Gustavo Guillermo Perez<br>> >> > > http://www.compunauta.com<br>> >> > > http://www.sendadevida.org<br>> >> > > http://anuncios.compunauta.net<br>> >> > ><br>> >> > > --<br>> >> > > Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>> >> > > de Grupos de Google.<br>> >> > > Si quieres publicar en este grupo, envía un mensaje de correo<br>> >> > > electrónico a ayuda-linux@googlegroups.com<br>> >> > > Para anular la suscripción a este grupo, envía un mensaje a<br>> >> > > ayuda-linux-unsubscribe@googlegroups.com<br>> >> > > Para obtener más opciones, visita este grupo en<br>> >> > > http://groups.google.es/group/ayuda-linux?hl=es. o<br>> >> > > http://www.compunauta.com/ayuda/<br>> >><br>> >><br>> >> --<br>> >> Gustavo Guillermo Perez<br>> >> http://www.compunauta.com<br>> >> http://www.sendadevida.org<br>> >> http://anuncios.compunauta.net<br>> >><br>> >> --<br>> >> Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>> >> de Grupos de Google.<br>> >> Si quieres publicar en este grupo, envía un mensaje de correo<br>> >> electrónico a ayuda-linux@googlegroups.com<br>> >> Para anular la suscripción a este grupo, envía un mensaje a<br>> >> ayuda-linux-unsubscribe@googlegroups.com<br>> >> Para obtener más opciones, visita este grupo en<br>> >> http://groups.google.es/group/ayuda-linux?hl=es. o<br>> >> http://www.compunauta.com/ayuda/<br>> >><br>> >> --<br>> >> Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>> >> de Grupos de Google.<br>> >> Si quieres publicar en este grupo, envía un mensaje de correo<br>> >> electrónico a ayuda-linux@googlegroups.com<br>> >> Para anular la suscripción a este grupo, envía un mensaje a<br>> >> ayuda-linux-unsubscribe@googlegroups.com<br>> >> Para obtener más opciones, visita este grupo en<br>> >> http://groups.google.es/group/ayuda-linux?hl=es. o<br>> >> http://www.compunauta.com/ayuda/<br>> >><br>> >> --<br>> >> Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>> >> de Grupos de Google.<br>> >> Si quieres publicar en este grupo, envía un mensaje de correo<br>> >> electrónico a ayuda-linux@googlegroups.com<br>> >> Para anular la suscripción a este grupo, envía un mensaje a<br>> >> ayuda-linux-unsubscribe@googlegroups.com<br>> >> Para obtener más opciones, visita este grupo en<br>> >> http://groups.google.es/group/ayuda-linux?hl=es. o<br>> >> http://www.compunauta.com/ayuda/<br>> ><br>> > --<br>> > Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>> > de Grupos de Google.<br>> > Si quieres publicar en este grupo, envía un mensaje de correo<br>> > electrónico a ayuda-linux@googlegroups.com<br>> > Para anular la suscripción a este grupo, envía un mensaje a<br>> > ayuda-linux-unsubscribe@googlegroups.com<br>> > Para obtener más opciones, visita este grupo en<br>> > http://groups.google.es/group/ayuda-linux?hl=es. o<br>> > http://www.compunauta.com/ayuda/<br>> <br>> -- <br>> Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>> de Grupos de Google.<br>> Si quieres publicar en este grupo, envía un mensaje de correo<br>> electrónico a ayuda-linux@googlegroups.com<br>> Para anular la suscripción a este grupo, envía un mensaje a<br>> ayuda-linux-unsubscribe@googlegroups.com<br>> Para obtener más opciones, visita este grupo en<br>> http://groups.google.es/group/ayuda-linux?hl=es. o http://www.compunauta.com/ayuda/<br> </body>
</html>
<p></p>
-- <br />
Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br />
de Grupos de Google.<br />
Si quieres publicar en este grupo, envía un mensaje de correo<br />
electrónico a ayuda-linux@googlegroups.com<br />
Para anular la suscripción a este grupo, envía un mensaje a<br />
ayuda-linux-unsubscribe@googlegroups.com<br />
Para obtener más opciones, visita este grupo en<br />
<a href="http://groups.google.es/group/ayuda-linux?hl=es">http://groups.google.es/group/ayuda-linux?hl=es</a>. o <a href="http://www.compunauta.com/ayuda/">http://www.compunauta.com/ayuda/</a>