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

[SOLUCIONADO] Consulta lenta

Estas en el tema de Consulta lenta en el foro de SQL Server en Foros del Web. Buenos dias gente del foro. Hace algun tiempo vengo desarrollando un sitio mediante PHP para montar en un servidor Windows Server 2008, que tiene como ...
  #1 (permalink)  
Antiguo 22/01/2013, 07:40
 
Fecha de Ingreso: octubre-2008
Ubicación: Bs. As., ARG
Mensajes: 203
Antigüedad: 15 años, 6 meses
Puntos: 6
Consulta lenta

Buenos dias gente del foro. Hace algun tiempo vengo desarrollando un sitio mediante PHP para montar en un servidor Windows Server 2008, que tiene como gestor de base de datos SQL Server 2005.
Estoy realizando la siguiente consulta (por ej.), y veo que demora demasiado:

Código:
$sql = "SELECT A.ID_AMBIENTACION, A.ID_PROD, A.ID_REF, B.RXRESC, B.CPA01, B.CPA02, B.CPA03 FROM AMBIENT_PROD AS A INNER JOIN Recursos AS B on (A.ID_AMBIENTACION  = '$id') and B.RXRESC = A.ID_PROD and EXISTS (select ID from AMBIENT_REF where ID = A.ID_REF) AND B.CPA01 is not null AND B.CPA02 is not null AND B.CPA03 is not null order by RXORDE ASC";
Esta consulta recorre una base de datos que contiene cerca de 6450 productos (tabla Recursos de la consulta).
Testeé la pagina php con la consulta, y la carga demora 8.05 seg.
Probé la misma pagina (es decir, el código de fuente resultado de la consulta) y la carga demora 1.51 seg.

En conclusión... tengo la duda si la consulta esta mal ejecutada, si SQL Server 2005 esta demasiado lento o si el servidor (VPS) es el causante de esto.
Que opinan?=

Última edición por chuekeron; 22/01/2013 a las 07:50
  #2 (permalink)  
Antiguo 22/01/2013, 09:17
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta lenta

lo clasico en este tipo de preguntas, tienes indices tu tabla?, que campos son los indexados, ya revsisaste el plan de ejecucion de tu query(en sql server en el dbm ctrl+l)??

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 22/01/2013, 09:27
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta lenta

Ademas de lo que comenta Libras, deberias de dejar de enviar codigo T-SQL desde tu capa cliente y crear store procedure.
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 22/01/2013, 09:48
 
Fecha de Ingreso: octubre-2008
Ubicación: Bs. As., ARG
Mensajes: 203
Antigüedad: 15 años, 6 meses
Puntos: 6
Respuesta: Consulta lenta

Cita:
Iniciado por Libras Ver Mensaje
lo clasico en este tipo de preguntas, tienes indices tu tabla?, que campos son los indexados, ya revsisaste el plan de ejecucion de tu query(en sql server en el dbm ctrl+l)??
saludos!
Bueno, la tabla no tiene indices (el cliente me dio las inyecciones SQL para la creacion de las tablas, dado que ellos vienen trabajando de esa manera con el sistema que actualizara la web).
Con respecto al plan de ejecución el Table Scan de la tabla recursos tiene un costo del 73% en la consulta, con valores muy elevados respecto a los demás.

Cita:
Iniciado por iislas Ver Mensaje
Ademas de lo que comenta Libras, deberias de dejar de enviar codigo T-SQL desde tu capa cliente y crear store procedure.
Justo estoy en eso!


La verdad es que es la primera vez que trabajo con SQL Server y cia, asi que les agradezo por su ayuda. Estoy atento a sus comentarios, y les cuento que onda con el SP!
  #5 (permalink)  
Antiguo 22/01/2013, 11:00
 
Fecha de Ingreso: octubre-2008
Ubicación: Bs. As., ARG
Mensajes: 203
Antigüedad: 15 años, 6 meses
Puntos: 6
Respuesta: Consulta lenta

Bueno, finalmente realice los Store Procedures correspondientes para la consulta. Pensé que de esa manera iba a optimizar los tiempos pero no...
Alguna idea?
  #6 (permalink)  
Antiguo 22/01/2013, 12:04
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta lenta

Ahi dices que tienes un table scan, eso es malo deberia de ser un index seek o index scan...
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 22/01/2013, 15:36
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta lenta

Libras: parecemos "Barman y Droguin"

chuekeron, ¿tus tablas tienen indices?, al menos, los campos que utilizas en el WHERE, deberian ser indices.

Optimiza tu busqueda con la opcion de TUNING ADVISOR
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 22/01/2013, 15:42
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta lenta

Cita:
Iniciado por iislas Ver Mensaje
Libras: parecemos "Barman y Droguin"
Asi parece amigo jejejeje :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 22/01/2013, 15:52
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta lenta

chuekeron

Veo que en tu INNER JOIN, estas colocando (A.ID_AMBIENTACION = '$id') y creo que esto es parte del WHERE, que no esta especificado.

¿Me equivoco?
__________________
MCTS Isaias Islas
  #10 (permalink)  
Antiguo 23/01/2013, 09:25
 
Fecha de Ingreso: octubre-2008
Ubicación: Bs. As., ARG
Mensajes: 203
Antigüedad: 15 años, 6 meses
Puntos: 6
Respuesta: Consulta lenta

Acabo de probar otra consulta, mucho mas sencilla y en una tabla mucho mas pequeña (1700 items):

Código:
select ID, DESCRIPCION from AMBIENT_REF where ID_AMBIENTACION = $id and ACTIVO = '1'
Dicha consulta, ordena los valores en un array y se imprimen mediante PHP.
Probé esto en una pagina sin estilos, sin nada... y para cargar una pagina con 12 - 15 valores demora aprox. 6.30 segundos en la carga de la misma.

Sumando mas fundamentos, cuando ejecuto las consultas en cuestión mediante SQL Server Management Studio veo que tardan muy poco en ejecutarse y devolver los valores (tanto esta ultima consulta como con la que plantee la problemática).

Creo que tal vez me enfoque mal, y la lentitud tal vez sea una cuestion de conexion a la DB o del procesamiento PHP en Windows Server.

Última edición por chuekeron; 23/01/2013 a las 09:31
  #11 (permalink)  
Antiguo 23/01/2013, 11:07
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta lenta

TODO EL PROBLEMA, esta en el PLAN DE EJECUCION que arma el motor de SQL Server, si recibe las instrucciones desde el CLIENTE (PHP), sera mucho mas lenta, que si lo indicas desde el MANAGER STUDIO.

Insisto, ¿tienes indices?
__________________
MCTS Isaias Islas
  #12 (permalink)  
Antiguo 23/01/2013, 11:41
 
Fecha de Ingreso: octubre-2008
Ubicación: Bs. As., ARG
Mensajes: 203
Antigüedad: 15 años, 6 meses
Puntos: 6
Respuesta: Consulta lenta

Cita:
Iniciado por iislas Ver Mensaje
TODO EL PROBLEMA, esta en el PLAN DE EJECUCION que arma el motor de SQL Server, si recibe las instrucciones desde el CLIENTE (PHP), sera mucho mas lenta, que si lo indicas desde el MANAGER STUDIO.

Insisto, ¿tienes indices?
Bueno, tal como le dije a Libras anteriormente las tablas no tienen indices.

De todas maneras, leyendo de foro en foro y dado que para mi había alguna cuestión mas q la propia consulta SQL descubrí que la extensión "php_mysql.dll" demoraba aprox. 5-6 segundos mas el procesamiento de la pagina, cuando yo creía que el problema era solo la consulta que ejecuto mediante el Store Procedure.
Ahora realiza la consulta e imprime resultados en aprox. 1.2-1.6 segundos (antes tardaba 6-7.5 segundos). Considerando que se ejecutan sentencias en 3 tablas, una de ellas con 6500 registros y otra con 2000, supongo que no esta mal.

De todas maneras voy a considerar el tema de la creación de los indices para determinados campos... lo que mas me preocupa en este sentido es la reorganización de los mismos a medida que se actualiza la base de datos.
  #13 (permalink)  
Antiguo 23/01/2013, 13:35
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta lenta

No deberia preocuparte, claro, que si estableces un PLAN DE MANTENIMIENTO que reorganice los indices.

Y eso, es muy sencillo.
__________________
MCTS Isaias Islas
  #14 (permalink)  
Antiguo 24/01/2013, 11:10
 
Fecha de Ingreso: octubre-2008
Ubicación: Bs. As., ARG
Mensajes: 203
Antigüedad: 15 años, 6 meses
Puntos: 6
Respuesta: Consulta lenta

Bien, finalmente cree los indices para la tabla en cuestión... logrando evitar los "Table Scan".
Claro que ahora me queda ver el tema de la actualización periódica de dichos indices, para lo cual utilizaría la siguiente sentencia:

Código SQL:
Ver original
  1. USE nombre_tabla
  2. GO
  3. EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"
  4. GO
  5. EXEC sp_updatestats
  6. GO

El incoveniente es que debo automatizar esa tarea. No puedo relizar un job, debido a que tengo SQL Server 2005 Express. Tampoco un task con el Management Studio Express.

Leyendo y leyendo del tema, llegue a la conclusion de que tal vez lo mejor sea ejecutar el SQL mediante la consola SQLCMD a través de un .bat, y programar la tarea que ejecute el .bat con el Task Scheduller.

Estoy en buen camino? (̶n̶i̶ ̶s̶i̶q̶u̶i̶e̶r̶a̶ ̶p̶u̶e̶d̶o̶ ̶e̶j̶e̶c̶u̶t̶a̶r̶ ̶l̶a̶ ̶c̶o̶n̶s̶o̶l̶a̶ ̶S̶Q̶L̶C̶M̶D̶,̶ ̶s̶e̶ ̶c̶i̶e̶r̶r̶a̶.̶ ̶Y̶ ̶y̶a̶ ̶t̶e̶n̶g̶o̶ ̶h̶a̶b̶i̶l̶i̶t̶a̶d̶a̶ ̶l̶a̶ ̶s̶u̶p̶e̶r̶f̶i̶c̶i̶e̶ ̶d̶e̶ ̶S̶Q̶L̶ ̶S̶e̶r̶v̶e̶r̶ ̶p̶a̶r̶a̶ ̶c̶o̶n̶e̶x̶i̶o̶n̶e̶s̶ ̶r̶e̶m̶o̶t̶a̶s̶)̶.̶

Última edición por chuekeron; 24/01/2013 a las 11:21
  #15 (permalink)  
Antiguo 24/01/2013, 11:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta lenta

si, si no puedes hacer un job haces un bat y los escheduleas con una windows task.


saludos!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #16 (permalink)  
Antiguo 24/01/2013, 13:30
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta lenta

es la forma en que se soluciona la ausencia del Agent en la edicion Express, con el Windows Task
__________________
MCTS Isaias Islas

Etiquetas: lenta, select, server, sql, tabla
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 23:15.