Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Optimizar Consulta SQL Server

Estas en el tema de Optimizar Consulta SQL Server en el foro de Bases de Datos General en Foros del Web. Buen día Necesito crear un procedimiento almacenado que traiga un campo llamado nombre en una tabla y lo busque con un LIKE en otra tabla. ...
  #1 (permalink)  
Antiguo 21/09/2011, 12:16
 
Fecha de Ingreso: septiembre-2011
Mensajes: 10
Antigüedad: 13 años, 2 meses
Puntos: 0
Optimizar Consulta SQL Server

Buen día

Necesito crear un procedimiento almacenado que traiga un campo llamado nombre en una tabla y lo busque con un LIKE en otra tabla.

Hasta ahí todo normal. el verdadero problema es que la tabla que tiene los nombres tiene aproximadamente 1000 registros y debo buscar cada uno de esos nombres en la otra tabla.

Para eso elabore un cursor que recorre los campos de la tabla de nombres y lo concatena a una consulta que tengo en una variable de la siguiente manera

Código:
DECLARE @CONSULTA (VARCHAR(MAX))

SET @CONSULTA='SELECT campo1,campo2,campo3 FROM tablafinal where'
por cada registro en la tabla nombre le agrego

Código:
SET @CONSULTA=@CONSULTA+' campo1 LIKE %'+Nombre+'% OR'
cuando termina la iteración ejecuto @consulta con un EXEC

esta consulta se esta demorando aproximadamente una hora y treinta minutos

Hay alguna forma de optimizarla???

De antemano Gracias.

Última edición por david_th; 21/09/2011 a las 12:16 Razón: ortografia
  #2 (permalink)  
Antiguo 21/09/2011, 12:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Optimizar Consulta SQL Server

Cita:
Hay alguna forma de optimizarla???
Por empezar, jamás pongas el "%" como letra inicial. Es lo peor qeu peudes hacer a nivel de performance, porque eso implica que busque en todos los registros, sin excepciones. Ten en cuenta que precisamente ese caracter es el comodín alfanumérico y por tanto incluye cualquier cosa que preceda el bloque buscado.
Luego, trata de definir algún tipo de índice en esa columna. Los índices ayudan a las búsquedas enormemente. Incluso, si vas a restringir la busqueda a una cantidad de X caracteres, puedes crear el índice sobre la base de las X+1 letras iniciales del contenido, lo que puede ayudar a la rapidez de la búsqueda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/09/2011, 13:32
 
Fecha de Ingreso: septiembre-2011
Mensajes: 10
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Optimizar Consulta SQL Server

Hola, muchas gracias por la respuesta.

El campo de la tabla "campo1" tiene un indice definido y me es imposible quitar el primer comodín puesto que el campo1 puede tener datos como

'miguel gonzales y pepito perez'

por eso agrego ese comodin.

no se si exista algo que consuma menos recursos de servidor dado que la tabla que estoy consultando tiene aproximadamente 5 millones de registros.

De antemano gracias.
  #4 (permalink)  
Antiguo 21/09/2011, 14:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 4 meses
Puntos: 774
Respuesta: Optimizar Consulta SQL Server

Usando un cursor?? y porque no haces un

select nombres from tabla where exists (select nombre from otra_tabla) en lugar de recorrer uno a uno los registros?? si usas el like si tienes un pedro gomez y en la otra tabla pedro gomez peres y pedro gomez gonzales entonces te tomara como que pedro gromex existe 2 veces eso esta bien??

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 21/09/2011, 15:29
 
Fecha de Ingreso: septiembre-2011
Mensajes: 10
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Optimizar Consulta SQL Server

Hola, muchas gracias por la respuesta. ´

para eso tengo un DISTINCT en la tabla que estoy consultando

voy a probar con el EXISTS

Última edición por david_th; 21/09/2011 a las 15:36 Razón: Mala Escritura
  #6 (permalink)  
Antiguo 21/09/2011, 15:43
 
Fecha de Ingreso: septiembre-2011
Mensajes: 10
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Optimizar Consulta SQL Server

No, finalmente el EXISTS no arroja los resultados que yo esperaba.

de todas formas muchas gracias
  #7 (permalink)  
Antiguo 21/09/2011, 21:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Optimizar Consulta SQL Server

Lo que te conviene en tu caso es crear dinámicamente un conjunto de condiciones LIKE sobre la base de descomponer la cadena ingresada en diferentes palabras, y usar sólo aquellas de más de 5 letras (esto último es porque el número de coincidencias con cuatro letras haría que la consulta fuese ineficiente).
De ese modo podrías eliminar el comodín inicial y aumentar la performance de la consulta en general.

Ten en cuenta que el hecho de que un usuario ingrese una cadena compuesta de varias palabras no implica que la cadena deba buscarse tal y como la puso (en todo caso eso es una opción posible). Fíjate si no, en el modo de hacer las búsquedas de Google cuando ingresas una frase.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 23/09/2011, 08:27
 
Fecha de Ingreso: septiembre-2011
Mensajes: 10
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Optimizar Consulta SQL Server

Muchas gracias por sus respuestas.

Finalmente logre una mejora en el tiempo de la consulta quitando un par de subconsultas que usaba y eliminando algunos indices que no se utilizaban.

la consulta paso de una hora y treinta minutos a solo 20 minutos.

Etiquetas: demoraenconsulta, optimizarconsulta, sql, sqlserver2005
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:29.