AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 24617
Accepted
AakashM
AakashM
Asked: 2012-09-21 06:29:26 +0800 CST2012-09-21 06:29:26 +0800 CST 2012-09-21 06:29:26 +0800 CST

Posso fazer com que o SSMS me mostre os custos reais da consulta no painel Plano de execução?

  • 772

Estou corrigindo problemas de desempenho em um procedimento armazenado de várias instruções no SQL Server. Quero saber em qual(is) parte(s) devo dedicar meu tempo.

Eu entendo de Como leio o custo da consulta e é sempre uma porcentagem? que mesmo quando o SSMS é instruído a Incluir o Plano de Execução Real , os valores de "Custo da consulta (relativo ao lote)" ainda são baseados em estimativas de custo , que podem estar muito distantes dos reais

Eu entendo de Medindo o desempenho da consulta: “Custo da consulta do plano de execução” vs “Tempo gasto” que posso cercar a invocação do procedimento armazenado com SET STATISTICS TIMEinstruções e, em seguida, obterei uma lista como esta no Messagespainel:

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 1 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

[etc]

 SQL Server Execution Times:
   CPU time = 187 ms,  elapsed time = 206 ms.

com uma mensagem de saída para cada instrução.

Posso associar 'facilmente' (embora não convenientemente) a saída de estatísticas de tempo com os planos de execução instrução por instrução no painel Plano de execução, contando-os: A quarta SQL Server Execution Timessaída de mensagem corresponde a Query 4no painel Plano de execução e assim por diante.

Mas existe uma maneira melhor?

sql-server performance
  • 3 3 respostas
  • 7074 Views

3 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2012-09-21T06:48:19+08:002012-09-21T06:48:19+08:00

    Não conheço uma maneira de fazer isso no plano do Management Studio, mas essa é uma das muitas coisas que o SentryOne Plan Explorer gratuito fará por você quando você gerar um plano real a partir da ferramenta - inclui todos os métricas de tempo de execução por instrução.

    • 8
  2. wBob
    2012-09-22T04:08:33+08:002012-09-22T04:08:33+08:00

    Uma boa maneira de fazer isso é com o Profiler. Configure uma "reprodução" do seu proc problemático em um desenvolvedor ou caixa de teste, ou seja, uma amostra de chamada para o proc com parâmetros. Em seguida, usando o Profiler, crie um rastreamento usando o modelo TSQL_SPs ou, a partir de um modelo em branco, adicione o evento SP:StmtCompleted. Adicione as colunas Duration, Reads, Writes e CPU se ainda não estiverem disponíveis. Adicione um filtro ao rastreamento em seu SPID (que você deve saber do Management Studio). Você também pode adicionar um filtro para Duração (por exemplo, maior que 1000 = maior que 1 segundo).

    Você pode executar o rastreamento no Profiler, embora haja sobrecarga (NÃO faça isso em uma caixa de produção) ou exportar a definição e criar um rastreamento do lado do servidor. A sobrecarga do Profiler não é grande coisa em um desenvolvedor ou caixa de teste dedicada.

    Execute o proc e deixe-o completo. Você também pode coletar o plano de execução real neste ponto.

    Interrompa o rastreamento e abra o arquivo, e você verá uma análise linha por linha do seu processo, incluindo os tempos de cada etapa. Acho isso mais útil do que o plano para identificar gargalos, embora o plano seja útil ao examinar as seções relevantes a serem ajustadas.

    HTH

    • 5
  3. Paul White
    2012-09-21T23:38:57+08:002012-09-21T23:38:57+08:00

    Você também pode usar as exibições de gerenciamento dinâmico sys.dm_exec_procedure_stats e sys.dm_exec_query_stats . A primeira delas informa sobre o procedimento como um todo; o segundo pode ser usado para dividir cada consulta no procedimento. Um exemplo é mostrado abaixo:

    USE AdventureWorks;
    GO
    CREATE PROCEDURE dbo.Test
        @NameLike nvarchar(50)
    AS
    BEGIN
        SELECT
            ProductCount = COUNT_BIG(*)
        FROM Production.Product AS p
        JOIN Production.TransactionHistory AS th ON
            th.ProductID = p.ProductID
        WHERE
            p.Name LIKE @NameLike;
    
        SELECT
            pc.Name,
            ProductCount = COUNT_BIG(*)
        FROM Production.Product AS p
        JOIN Production.ProductSubcategory AS ps ON
            ps.ProductSubcategoryID = p.ProductSubcategoryID
        JOIN Production.ProductCategory AS pc ON
            pc.ProductCategoryID = ps.ProductCategoryID
        WHERE
            p.Name LIKE @NameLike
        GROUP BY
            pc.Name
        ORDER BY
            pc.Name;
    END;
    GO
    EXECUTE dbo.Test @NameLike = N'A%';
    EXECUTE dbo.Test @NameLike = N'F%';
    

    Estatísticas do procedimento:

    SELECT
        deps.last_execution_time,
        deps.last_worker_time,
        deps.last_physical_reads,
        deps.last_logical_writes,
        deps.last_logical_reads,
        deps.last_elapsed_time
    FROM sys.dm_exec_procedure_stats AS deps
    WHERE
        deps.database_id = DB_ID()
        AND deps.[object_id] = OBJECT_ID(N'dbo.Test', N'P');
    

    Dúvidas dentro do procedimento:

    SELECT
        query.the_text,
        deqs.last_execution_time,
        deqs.last_worker_time,
        deqs.last_physical_reads,
        deqs.last_logical_writes,
        deqs.last_logical_reads,
        deqs.last_clr_time,
        deqs.last_elapsed_time,
        deqs.last_rows    -- note: Only present from 2008 R2 onwards
    FROM sys.dm_exec_query_stats AS deqs
    CROSS APPLY sys.dm_exec_sql_text(deqs.[sql_handle]) AS dest
    CROSS APPLY
    (
        VALUES 
        (
            SUBSTRING
            (
                dest.[text], 
                deqs.statement_start_offset / 2 + 1,
                (ISNULL(NULLIF(deqs.statement_end_offset, -1), DATALENGTH(dest.[text])) - deqs.statement_start_offset) / 2 + 1
            )
        )
    ) AS query (the_text)
    WHERE
        deqs.[sql_handle] IN
        (
            SELECT
                deps.[sql_handle]
            FROM sys.dm_exec_procedure_stats AS deps
            WHERE
                deps.database_id = DB_ID()
                AND deps.[object_id] = OBJECT_ID(N'dbo.Test', N'P')
        );
    
    • 4

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve