none
Búsqueda de texto en varios campos RRS feed

  • Pregunta

  • Hola a todos,

        un amigo tiene un sistema en el cual puede buscar, en varios campos de un par de tablas (linkeadas con un LEFT JOIN) un texto cualquiera. Para eso usa un CAMPO1 LIKE '%texto%' OR CAMPO2 LIKE '%texto%', etc. Por supuesto esta búsqueda no es eficiente en absoluto porque no hay otra opción que hacer un table scan para encontrar las filas.

       Existe una mejor alternativa? Pensé en un Full Text index pero solo parece que busca palabras y no cualquier texto.

       Cualquier sugerencia es bienvenida.

       Saludos.  


    Mauricio


    • Editado TDCSoftware martes, 11 de diciembre de 2018 12:46
    martes, 11 de diciembre de 2018 12:44

Respuestas

  • Efectivamente, el Full Text sera mucho mas eficiente que el full table scan. Pero la forma en la que funciona es troceando el texto en palabras e indexando todas esas palabras. Por tanto, solo vale para buscar palabras completas (y sinonimos, inflexiones, y cosas parecidas).

    Pero si necesitas un LIKE '%texto%', es decir, despreciando el resto de la palabra por la derecha y por la izquierda, entonces no hay otro remedio que hacer el full table scan. Para agilizar al maximo el table scan, puedes poner en una tabla unicamente los campos minimos en los que vas a buscar, con el fin de que quepa el maximo de registros en cada pagina, y luego el resto de los campos meterlos en una tabla vinculada por un foreign key en una relacion de 1 a 1. Si necesitas "whre campo1... or campo2...", puedes incluso poner el campo1 en una tabla y el campo2 en otra. El optimizador de consultas puede paralelizar los dos scans para que se realicen a la vez, sobre todo si ambas tablas est'an en distintos ejes.

    Todo esto presume que tienes millones de registros. Si es una tablita pequeña, entonces ni te preocupes, no cambies nada en la tabla y deja los like como los tienes.

    • Marcado como respuesta TDCSoftware martes, 11 de diciembre de 2018 14:03
    martes, 11 de diciembre de 2018 13:58

Todas las respuestas

  • Efectivamente, el Full Text sera mucho mas eficiente que el full table scan. Pero la forma en la que funciona es troceando el texto en palabras e indexando todas esas palabras. Por tanto, solo vale para buscar palabras completas (y sinonimos, inflexiones, y cosas parecidas).

    Pero si necesitas un LIKE '%texto%', es decir, despreciando el resto de la palabra por la derecha y por la izquierda, entonces no hay otro remedio que hacer el full table scan. Para agilizar al maximo el table scan, puedes poner en una tabla unicamente los campos minimos en los que vas a buscar, con el fin de que quepa el maximo de registros en cada pagina, y luego el resto de los campos meterlos en una tabla vinculada por un foreign key en una relacion de 1 a 1. Si necesitas "whre campo1... or campo2...", puedes incluso poner el campo1 en una tabla y el campo2 en otra. El optimizador de consultas puede paralelizar los dos scans para que se realicen a la vez, sobre todo si ambas tablas est'an en distintos ejes.

    Todo esto presume que tienes millones de registros. Si es una tablita pequeña, entonces ni te preocupes, no cambies nada en la tabla y deja los like como los tienes.

    • Marcado como respuesta TDCSoftware martes, 11 de diciembre de 2018 14:03
    martes, 11 de diciembre de 2018 13:58
  • Gracias Alberto, era lo que me temía. Tendré que dejar el query como está, más que nada porque el WHERE lo hace por campos de una y otra tabla que encima están relacionadas con el LEFT JOIN. Por probar, intentaré si pasando la tabla a in-memory la performance mejora, la tabla en sí no es grande (dudo que llegue a las 100.000 filas) pero mi amigo dice que sus clientes se quejan porque tarda mucho (alrededor de 2 segundos).

    Muchas gracias nuevamente.


    Mauricio - Copenhague - Dinamarca

    martes, 11 de diciembre de 2018 14:06