Como criar um perfil de procedimentos armazenados

26

Estou usando o SQL Server 2012 e queria saber como criar um perfil de procedimentos armazenados

Por exemplo, o criador de perfil pode capturar cada instrução SQL individual em um procedimento armazenado, o que é e quanto tempo leva para executar, etc?

Estou tentando diagnosticar procedimentos armazenados de replicação de mesclagem e isso deve ser capturado como parte de uma execução completa do agente de mesclagem. Não parece possível pegar o procedimento armazenado com problemas de desempenho e executá-lo novamente, porque nesse momento não é lento.

Pedro
fonte

Respostas:

27

A resposta de Kevin descreve quais eventos capturar no SQL Trace / SQL Profiler. Expandir um pouco essa resposta - SP:StmtCompletedmostrará cada instrução dentro de um procedimento armazenado sendo concluída, como parece.

Além disso, se você estiver em um sistema ocupado e tentando diagnosticar um problema de desempenho, tenha cuidado com o SQL Profiler. O SQL Profiler é muito mais lento que rastrear para um arquivo ou usar Eventos Estendidos. Esta postagem no blog de Jonathan Kehayias mostra cerca de 90% de sobrecarga no desempenho de um sistema usando o SQL Profiler e cerca de 10% de sobrecarga do rastreamento para o arquivo. Menos para eventos estendidos. É por isso que geralmente é recomendável não executar o próprio SQL Profiler enquanto

Embora essas informações estejam disponíveis por meio de eventos estendidos, eu sugeriria ainda usar o SQL Trace (a tecnologia por trás do SQL Profiler), mas rastrear para um arquivo(se você quiser investir no aprendizado e no uso de Eventos Estendidos, esse é o caminho a seguir, uma versão futura do SQL Server SQL Trace desaparecerá e tudo o que teremos serão Eventos Estendidos). Também sugiro que você filtre através do botão Filtros de coluna o máximo possível de ruído de fundo, para garantir que você esteja capturando apenas o necessário. Você pode configurar seu rastreamento com a ferramenta Profiler usando as etapas que Kevin descreve em sua boa resposta e, em seguida, adicionar um filtro dessa mesma GUI. Em seguida, você pode exportar o rastreamento como um script e executá-lo no rastreamento do SQL Server para um arquivo em uma pasta que não contém arquivos de banco de dados ou de log de transações. Para exportar, basta configurar seu rastreio, executá-lo por alguns segundos para garantir que você esteja capturando o que deseja, pará-lo e, em seguida, vá para a barra de menus e File->Export-> Script Trace Definitione salve o arquivo. Em seguida, abra esse arquivo em uma nova janela de consulta no servidor que você deseja rastrear. Você pode ver mais sobre as opções e definições deste script que você criou consultando os artigos de ajuda para os vários procedimentos armazenados usados ​​nesse script que você acabou de criar, começando aqui .

Se você tiver tempo e quiser aprender, também pode ler alguns artigos sobre Eventos Estendidos e ver como capturar as informações também. Jonathan Kehayias é um ótimo recurso para postagens de blog quando você estiver pronto para começar por aí.

Mike Walsh
fonte
2
E quando um SP: StmtCompleted apenas mostra "- Texto criptografado" no texto da consulta? Como podemos descobrir quais tabelas estão sendo acessadas?
precisa saber é o seguinte
Tendo o mesmo problema que você @ Brain2000 ....
wenzzzel 24/03
21

Você pode capturar as instruções individuais em um procedimento armazenado através do SQL Server Profiler. Para fazer isso, na guia Seleção de eventos, clique na caixa de seleção "Mostrar todos os eventos". Em seguida, role para baixo até a categoria Procedimentos armazenados e marque a caixa ao lado de SP: StmtCompleted . Se você também tiver os eventos SQL: BatchStarted e SQL: BatchCompleted selecionados, poderá obter uma imagem do início ao fim de uma execução de procedimento armazenado, vinculando tudo pelo SPID.

Também pode ser útil examinar o cache do plano para ver se você pode obter um plano de consulta para o procedimento de execução lenta. Você pode começar com algo assim:

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';
Kevin Feasel
fonte