Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

[Solucionado] Consumo elevado de tiempo de consulta.

21 de marzo de 2016

Saludos.

Continuando con este punto

Encontre que una consulta que se executa varias veces, esta consumiendo entre 600-900 ms en ejecutarse por cada petición.

SELECT 
  t0_.apacodigo AS apacodigo0, 
  t0_.apalegajo AS apalegajo1, 
  t0_.apafecha AS apafecha2, 
  t0_.apahorae AS apahorae3, 
  t0_.apahoras AS apahoras4 
FROM 
  tbcasapa t0_ 
WHERE 
  t0_.apalegajo LIKE ? AND t0_.apafecha = ? 
ORDER BY 
  t0_.apacodigo ASC

Lo raro es que tengo otra consulta (contiene join) a otra tabla de la misma base de datos teniendo una complejidad similar, se esta demorando en ejecutar 1-3 ms por consulta realizada.

SELECT 
  t0_.etrlegajo AS etrlegajo0, 
  t0_.etrfecha AS etrfecha1, 
  t1_.trahoraini AS trahoraini2, 
  t1_.trahorafin AS trahorafin3 
FROM 
  tbcasetr t0_ 
INNER JOIN 
  tbcastra t1_ ON (
    t1_.tracodigo = t0_.etrtramo 
  ) 
WHERE 
  t0_.etrfecha = ? AND t0_.etrtramo NOT IN (?) AND t0_.etrlegajo LIKE ?

No se que se debera esto. La base de dato es ms sql server 2008 R2


Respuestas

#1

Como no uso MS SQLServer, quizás lo que te comento no te va a servir. El caso es que la consulta lenta tiene una condición LIKE. Al menos en MySQL/PostgreSQL, si la tabla no tiene índices para ese tipo de consultas, la ejecución es lentísima.

Lo primero que miraría es qué indices tiene la consulta rápida (que también usa LIKE) y los compararía con los índices de la consulta lenta.

Otra cosa que no se si funciona en SQLServer es la opción de "Explain this query" que muestra el profiler de Symfony. Al menos en MySQL/PostgreSQL te dice si la consulta está usando índices, etc.

Por último, como en tu anterior mensaje decías que los datos se actualizan más o menos una vez al día y luego ya las consultas siempre se repiten, creo que te convendría usar la caché de resultados de Doctrine. Activarla es facilísimo, como por ejemplo se explica en este artículo.

@javiereguiluz

21 marzo 2016, 15:54
#2

Gracias, @javiereguiluz

Estaba usando "LIKE" por que todos los campos que son asignados como texto, tiene definido un largo de fijo, y al compararlo con un valor, arrojaba ningún resultado al tener espacio.

Al modificar en este caso de "LIKE" a comparación (=), disminuyo drásticamente el tiempo consumido.

  • Antes: entre 30 a 180 segundos.
  • Ahora: entre 1 a 3 segundos.

En ejecutarse.

Al revisar la opción "Explain this query" sobre la consulta no muestra nada puede ser porque no lo soporta o no tiene definido un índice.

Por ultimo, ¿sabrías dónde puedo encontrar información relacionada con posibles cuello de botellas, tanto en el código o en consultas a la bd?

Gracias nuevamente.

@dariongg

21 marzo 2016, 16:31
#3

La mejor herramienta que conozco para este tipo de cosas se llama Blackfire.io. La versión gratuita el servicio te da casi toda la información que necesitas e incluso tiene una sección llamada "Recomendaciones" que es justo lo que estás buscando: te dice lo que puedes cambiar en tu aplicación para mejorar su rendimiento.

(Me gustaría añadir que ahora mismo trabajo para una empresa llamada SensioLabs, que está relacionada con Blackfire.io - Seguiría recomendando Blackfire aunque no trabajara para esa empresa, pero me parece que avisar sobre esta circunstancia es necesario)

@javiereguiluz

21 marzo 2016, 16:40
#4

¿La herramienta es online o se puede ejecutar en el servidor?

Si es el primero no me serviría, porque las aplicaciones son internas.

@dariongg

21 marzo 2016, 16:57
#5

En el servidor tienes que instalar una extensión PHP y luego en tu ordenador de desarrollo instalas otro pequeño programa que se comunica con el. Luego tu accederías a la aplicación privada desde tu ordenador y pinchas en un botón de una una extensión del navegador para que se haga el "profile" de la página que estás viendo.

Después, desde tu ordenador de desarrollo se suben los resultados automáticamente al sitio blackfire.io, donde puedes analizarlos tranquilamente. Así que el servidor no tiene que tener conexión hacia Internet, pero tu ordenador de desarrollo si.

En esta página tienes más información sobre cómo instalar Blackfire.io: https://blackfire.io/docs/up-and-running/installation

@javiereguiluz

21 marzo 2016, 17:13