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
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
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
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
¿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
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