Una forma de determinar el procedimiento almacenado en ejecución es utilizar métodos de "administración dinámica", de esta manera:
SELECT
sqlText.Text, req.*
FROM
sys.dm_exec_requests req
OUTER APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Sin embargo, esto solo muestra el texto de la instrucción create del procedimiento almacenado. p.ej:
CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Idealmente, me gustaría ver cuáles fueron los parámetros para el procedimiento de ejecución que hacen que se ejecute tanto tiempo para el conjunto particular de parámetros ofensivos.
¿Hay una manera de hacer eso? (En esta pregunta, Aaron Bertrand menciona DBCC InputBuffer , pero no creo que sea apropiado para este problema).
sql-server
t-sql
sql-server-2005
stored-procedures
dmv
usuario420667
fuente
fuente
Respuestas:
Esta información (valores de parámetros en tiempo de ejecución pasados a un procedimiento almacenado (es decir, una llamada RPC) o una consulta parametrizada) solo está disponible a través de un seguimiento de SQL (y supongo que el evento extendido equivalente en las versiones más nuevas de SQL Server). Esto se puede ver mediante la ejecución de Analizador de SQL Server (que viene con SQL Server) y la selección de los distintos eventos "completadas", tales como:
RPC:Completed
,SP:Completed
, ySQL:BatchCompleted
. También debe seleccionar el campo "TextData" ya que los valores estarán allí.La diferencia entre mi respuesta y @ de Kin respuesta a esta cuestión es que la respuesta de @ Kin (si no me equivoco, en cuyo caso voy a eliminar esta) se centra en conseguir ya sea:
Mi respuesta se centra en obtener los valores de los parámetros para otras sesiones que se están ejecutando actualmente. Al confiar en los DMV, no hay forma de saber si el valor del parámetro de tiempo de ejecución es el mismo que el valor del parámetro compilado. Y el contexto de esta pregunta es rastrear el valor de tiempo de ejecución de las consultas que se envían a través de otras Sesiones / SPID (y en SQL Server 2005, mientras que los Eventos extendidos se introdujeron en SQL Server 2008).
fuente
Usted puede activar el plan de ejecución real y luego mirar el plan de ejecución XML.
O puede utilizar la herramienta del explorador plan de centinela SQL y ver la
parameters
pestaña que enumerará elcompiled value
yrun time value
para el plan de ejecución real.Si no puede activar el plan real, puede buscar en la memoria caché del plan como se describe a continuación.
fuente
Showplan XML Statistics Profile
evento en Profiler para obtener el plan real, aunque si elimina Profiler habría formas menos intensivas de obtener esto.@SolomonRutzky tiene razón.
SQL Profiler Trace es la única forma ( sin editar el Sproc ).
Edite su Sproc:
Sin embargo , la siguiente mejor opción es editar ligeramente el Sproc en cuestión.
Declare una variable DateTime al principio con la hora actual.
Al final de Sproc, registre Sproc_StartTime, Sproc_EndTime y los valores de los parámetros en una tabla.
Incluso podría agregar algo de lógica condicional para usar un DateDiff () solo para el registro cuando se utilizó una cantidad de tiempo prolongada en el procesamiento de Sproc.
Esto puede acelerar su Sproc y reducir el consumo de espacio de su tabla de registro para cuando el Sproc se ejecuta de la mejor manera.
Luego tiene un archivo de registro que puede consultar y analizar durante meses (sin un seguimiento ejecutándose en Prod).
Cuando haya terminado de ajustar su Sproc, simplemente elimine las pocas líneas de lógica de temporizador y registrador que agregó.
Valores de parámetros del plan en caché:
Debo mencionar que incluir los valores actuales de los parámetros del plan en caché en su tabla de registro puede ayudarlo a determinar si están agravando el problema de rendimiento .
Utilizo
OPTIMIZE FOR
para configurar cómo manejar los parámetros en mi Sproc cuando sé que se usará para cortar y cortar datos.Creo que el uso
OPTIMIZE FOR
produce resultados consistentes y rápidos cuando se usa el mismo Sproc con parámetros que los filtros opcionales .Definitivamente es una variable menos a tener en cuenta si especifica cómo manejarlos.
A continuación se muestra un ejemplo de lo que puede agregar al final de su Select-Statement:
fuente
Me di cuenta al usar la consulta de Erland Sommarskog para destruir el plan XML y extraer ParameterCompiledValue que el primer CTE "basedata" no tiene en cuenta los planes que tienen ADVERTENCIAS (por ejemplo, conversiones implícitas) ya que el CHARINDEX (función incorporada) busca la primera cadena de coincidencia de expresión input (es decir) y tales advertencias usan estas mismas frases / nodos.
Por lo tanto, propongo reemplazar esta sección con la sección revisada a continuación:
Sección revisada:
fuente
Disallowed implicit conversion from data type xml to data type varchar, table 'sys.dm_exec_query_plan', column 'query_plan'. Use the CONVERT function to run this query.
fuente