|
|
Publicado en 21/5/2018 13:55:48
|
|
|

En los últimos dos días, me he encontrado con un problema bastante frustrante: se ejecuta un procedimiento almacenado de unas 120 líneas en el analizador de consultas de SQL Server 2012, La velocidad es muy ideal, y se pueden filtrar y capturar unos 500 registros de datos en menos de 1 segundo. Sin embargo, cuando se llama al código del programa C#, se solicita el tiempo de espera de la conexión. Pon el CommandTimeout en 300 y tardará unos 3 minutos en mostrarse. He revisado el código varias veces y no he encontrado errores. El problema sigue siendo.
Análisis de causa: 1. Porque la velocidad de ejecución en el analizador de consultas es rápida y la cantidad de datos no es grande. 2. La única llamada para que el programa sea lento. 3. Establece el parámetro CommandTimeout y el resultado puede mostrarse, pero llevará mucho tiempo.
En resumen, se concluye preliminarmente que el problema reside en el código C#. Pero no hubo ningún beneficio tras la inspección.
Consulta esta información en Baidu. Finalmente encontré una publicación de información similar en el foro de CSDN. Uno de los internautas dijo en la respuesta: "Es posible que el plan de implementación haya expirado". Realmente me despertó en mi sueño.
Ejecuta inmediatamente en el analizador de consultas:
Probando el programa de nuevo, esta vez por fin funcionó. La velocidad es muy satisfactoria.
Análisis de causa: Dado que los procedimientos almacenados están precompilados, se genera un plan de ejecución en la primera ejecución, y este plan de ejecución se utiliza en ejecuciones posteriores (a menos que se especifique que el procedimiento almacenado debe ser recompilado), en lugar de generar un plan de ejecución cada vez que se ejecuta. Cuando se ajusta la estructura del objeto implicada en el procedimiento almacenado, o los datos relacionados cambian significativamente, lo que puede hacer que el plan original no sea adecuado para el statu quo actual (expiración del plan de ejecución), el procedimiento almacenado debe recompilarse.
Finalmente, adjunta el código del procedimiento almacenado:
|
Anterior:Comparte un único código de código promocional de APP, adaptativo, muy bonito y generoso.Próximo:Marco de código abierto C# (Reimpresión)
|