Estoy tratando de entender un problema que tenemos con SQL Server 2000. Somos un sitio web moderadamente transaccional y tenemos un proceso almacenado llamado sp_GetCurrentTransactions
que acepta un ID de cliente y dos fechas.
Ahora, según las fechas y el cliente, esta consulta puede devolver cualquier cosa, desde cero hasta miles de filas.
El problema: lo que hemos experimentado es que de repente obtendremos una serie de errores (típicamente Execution Timeout Expired
o similares) para un cliente en particular mientras intentan ejecutar ese proceso almacenado. Así que examinamos la consulta, la ejecutamos en SSMS y descubrimos que tarda 30 segundos. Así que volvemos a compilar el proceso almacenado y -bang- ahora se ejecuta en 300 ms.
He hablado con nuestro DBA sobre esto. Me ha dicho que la base de datos creó un plan de consulta cuando creamos el proceso almacenado. Dijo que era un buen plan para ese conjunto de parámetros, pero si le arroja un cierto conjunto de parámetros, entonces el plan no será el mejor plan para esos datos, por lo que verá que se ejecuta lentamente.
Las opciones que se me presentan son mover esa consulta problemática desde un proceso almacenado y volver al SQL dinámico que tiene su plan de ejecución creado en cada ejecución.
Esto se siente como un paso atrás para mí y siento que debe haber una forma de evitar esto. ¿Hay alguna otra forma de lidiar con este problema?
Todas y cada una de las respuestas son apreciadas.