Uma maneira de determinar o procedimento armazenado em execução é usar métodos de "gerenciamento dinâmico", como:
SELECT
sqlText.Text, req.*
FROM
sys.dm_exec_requests req
OUTER APPLY
sys.dm_exec_sql_text(req.sql_handle) AS sqltext
No entanto, isso exibe apenas o texto da instrução de criação do procedimento armazenado. por exemplo:
CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Idealmente, gostaria de ver quais eram os parâmetros para o procedimento em execução que estão causando a execução por tanto tempo para o conjunto específico de parâmetros incorretos.
Existe uma maneira de fazer isso? ( Nesta pergunta, Aaron Bertrand menciona o DBCC InputBuffer , mas não acho que seja apropriado para esse problema.)
sql-server
t-sql
sql-server-2005
stored-procedures
dmv
user420667
fonte
fonte
Respostas:
Essas informações - valores de parâmetros em tempo de execução passados para um Procedimento armazenado (chamada RPC) ou consulta parametrizada - estão disponíveis apenas através de um rastreamento SQL (e eu presumo que o evento estendido equivalente nas versões mais recentes do SQL Server). Você pode ver isso executando SQL Server Profiler (que vem com o SQL Server) e selecionando os vários eventos "concluído", tais como:
RPC:Completed
,SP:Completed
, eSQL:BatchCompleted
. Você também precisa selecionar o campo "TextData", pois os valores estarão lá.A diferença entre a minha resposta e de @ Kin resposta a esta questão é que resposta da @ Kin (se não me engano, caso em que eu vou remover esse) se concentra em obter ou:
Minha resposta se concentra em obter os valores dos parâmetros para outras sessões em execução no momento. Ao confiar nas DMVs, não há como saber se o valor do parâmetro de tempo de execução é o mesmo que o valor do parâmetro compilado. E o contexto dessa pergunta é rastrear o valor do tempo de execução das consultas enviadas por outras sessões / SPIDs (e no SQL Server 2005, enquanto os Eventos estendidos foram introduzidos no SQL Server 2008).
fonte
Você pode ativar o plano de execução real e, em seguida, examinar o XML do plano de execução.
Ou você pode usar ferramenta de plano de explorador de sentinela sql e veja o
parameters
guia que irá listar ocompiled value
erun time value
para o plano de execução real.Se você não conseguir ativar o plano real, poderá procurar no cache do plano, conforme descrito abaixo.
fonte
Showplan XML Statistics Profile
evento no Profiler para obter o plano real, embora, se o Profiler fosse implementado, haveria maneiras menos intensivas de obter isso.@SolomonRutzky está certo.
O rastreio do SQL Profiler é a única maneira ( sem editar o Sproc ).
Edite seu Sproc:
No entanto , a próxima melhor coisa é editar um pouco o Sproc em questão.
Declare uma variável DateTime no início com a Hora Atual.
No final do Sproc, registre os valores Sproc_StartTime, Sproc_EndTime e Parameter em uma tabela.
Você pode até adicionar alguma lógica condicional para usar um DateDiff () para registrar apenas quando uma quantidade prolongada de tempo foi usada no processamento do Sproc.
Isso pode acelerar o seu Sproc e reduzir o consumo de espaço da sua tabela de logs para quando o Sproc estiver em execução.
Então você tem um arquivo de log que pode consultar e analisar ao longo de meses (sem um rastreamento em execução no Prod).
Quando terminar de ajustar o Sproc, exclua as poucas linhas da lógica do Timer e Logger que você adicionou.
Valores dos parâmetros do plano em cache:
Devo mencionar que a inclusão dos valores atuais dos parâmetros do plano em cache na tabela de log pode ajudá-lo a determinar se eles estão agravando o problema de desempenho .
Eu uso
OPTIMIZE FOR
para definir como lidar com os Parâmetros no meu Sproc quando sei que ele será usado para fatiar e cortar dados.Acho que o uso
OPTIMIZE FOR
gera resultados consistentes e rápidos ao usar o mesmo Sproc com parâmetros que os filtros opcionais .Definitivamente, é uma variável a menos a considerar se você especificar como lidar com elas.
Abaixo está um exemplo do que você pode adicionar na parte inferior da sua instrução Select:
fonte
Notei ao usar a consulta de Erland Sommarskog para fragmentar o XML do plano e extrair ParameterCompiledValue que o primeiro CTE "baseado em dados" não leva em conta planos que possuem WARNINGS (por exemplo, conversões implícitas) como o CHARINDEX (função interna) procura pela primeira expressão que corresponde à string input (ie) e esses avisos usam essas mesmas frases / nós.
Por isso, proponho substituir esta seção pela seção revisada abaixo:
Seção revisada:
fonte
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.
fonte