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 / 19544
Accepted
AngryHacker
AngryHacker
Asked: 2012-06-20 17:01:33 +0800 CST2012-06-20 17:01:33 +0800 CST 2012-06-20 17:01:33 +0800 CST

Até que ponto as compilações SQL afetam o desempenho do SQL Server?

  • 772

Estou criando o perfil de uma instância de um SQL Server 2005 e, por meio da SQLServer:SQL Statistics - SQL Compilations/secmétrica do PerfMon, vejo que a média é de cerca de 170 ou mais.

Saquei o SQL Profiler e procurei por eventos SP:Compile ou SQL:Compile. Aparentemente eles não existem. Eu encontrei Stored Procedure/SP:Recompilee TSQL/SQL:StmtRecompileeventos. A quantidade de dados que vejo no Profiler sugere que esses são os eventos errados a serem observados, embora eu não tenha certeza.

Então minhas perguntas. As respostas para qualquer uma delas seriam ótimas.

  1. Como posso ver exatamente o que está compilando no SQL Server?
  2. Escolhi as métricas erradas para analisar? No Perfmon ou no SQL Profiler?
  3. Com relação a Stored Procedure/SP:Recompileeventos TSQL/SQL:StmtRecompileno SQL Profiler... eles não incluem a métrica Duration. Como posso avaliar o impacto desses eventos no sistema se eles não fornecem uma maneira de ver o impacto do tempo no sistema.
sql-server performance
  • 2 2 respostas
  • 26277 Views

2 respostas

  • Voted
  1. Best Answer
    Thomas Stringer
    2012-06-20T17:13:47+08:002012-06-20T17:13:47+08:00

    Compilações de SQL/s é uma boa métrica, mas somente quando combinada com Solicitações em lote/s . Por si só, as compilações por segundo não dizem muito.

    Você está vendo 170. Se o lote req por segundo for apenas 200 (um pouco exagerado para efeito), então sim, você precisa ir ao fundo da causa (provavelmente um uso excessivo de consultas ad hoc e planos de uso único). Mas se o seu lote req por segundo está medindo cerca de 5000, então 170 compilações por segundo não é nada ruim. É uma regra geral que as compilações/s devem ser 10% ou menos do que o total de solicitações em lote/s .

    Se você realmente deseja detalhar o que está sendo armazenado em cache, execute a seguinte consulta que utiliza os DMVs apropriados:

    select
        db_name(st.dbid) as database_name,
        cp.bucketid,
        cp.usecounts,
        cp.size_in_bytes,
        cp.objtype,
        st.text
    from sys.dm_exec_cached_plans cp
    cross apply sys.dm_exec_sql_text(cp.plan_handle) st
    

    Para obter todos os planos de uso único (uma contagem):

    ;with PlanCacheCte as 
    (
        select
            db_name(st.dbid) as database_name,
            cp.bucketid,
            cp.usecounts,
            cp.size_in_bytes,
            cp.objtype,
            st.text
        from sys.dm_exec_cached_plans cp
        cross apply sys.dm_exec_sql_text(cp.plan_handle) st
    )
    select count(*)
    from PlanCacheCte
    where usecounts = 1
    

    Para obter uma proporção de quantos planos de contagem de uso único você tem em comparação com todos os planos em cache:

    declare @single_use_counts int, @multi_use_counts int
    
    ;with PlanCacheCte as 
    (
        select
            db_name(st.dbid) as database_name,
            cp.bucketid,
            cp.usecounts,
            cp.size_in_bytes,
            cp.objtype,
            st.text
        from sys.dm_exec_cached_plans cp
        cross apply sys.dm_exec_sql_text(cp.plan_handle) st
        where cp.cacheobjtype = 'Compiled Plan'
    )
    select @single_use_counts = count(*)
    from PlanCacheCte
    where usecounts = 1
    
    ;with PlanCacheCte as 
    (
        select
            db_name(st.dbid) as database_name,
            cp.bucketid,
            cp.usecounts,
            cp.size_in_bytes,
            cp.objtype,
            st.text
        from sys.dm_exec_cached_plans cp
        cross apply sys.dm_exec_sql_text(cp.plan_handle) st
        where cp.cacheobjtype = 'Compiled Plan'
    )
    select @multi_use_counts = count(*)
    from PlanCacheCte
    where usecounts > 1
    
    select
        @single_use_counts as single_use_counts,
        @multi_use_counts as multi_use_counts,
        @single_use_counts * 1.0 / (@single_use_counts + @multi_use_counts) * 100
            as percent_single_use_counts
    

    Quanto às durações capturadas por meio de um rastreamento do SQL Server, ele não está disponível para os eventos de recompilação. Não é tão significativo ver a duração ou a dor que a compilação do plano está causando, pois não há muito o que fazer para uma situação caso a caso. A solução é tentar limitar compilações e recompilações por meio de reutilização de planos (consultas parametrizadas, procedimentos armazenados, etc.).

    • 37
  2. Jon Seigel
    2012-06-21T06:27:01+08:002012-06-21T06:27:01+08:00

    Existem três contadores relevantes que devem ser registrados usando PerfMon (ou outra solução de terceiros). O ponto chave é registrar essas estatísticas de alguma forma.

    • Estatísticas SQL\Solicitações em lote/s
    • Estatísticas SQL\Compilações SQL/s
    • Estatísticas SQL\Recompilações SQL/s

    Como Thomas Stringer mencionou , é bom ficar de olho na proporção de compilações/solicitação em lote. Obviamente, quanto mais baixo melhor, mas existem apenas diretrizes para o que é "bom", e só você pode decidir o que é aceitável. A quantidade absoluta de ganho de desempenho que você verá reduzindo o número de compilações depende de muitos fatores.

    Também gosto de observar a proporção de recompilations/compilation , para ter uma noção da quantidade de reutilização do plano de consulta. Novamente, menor é melhor. Nesse caso, no entanto, você deseja que as recompilações aconteçam no sistema à medida que as estatísticas mudam (se o banco de dados for somente leitura e você tiver recompilações... algo pode estar errado). Assim como eu disse anteriormente, existem apenas diretrizes para o que é "bom".

    O que você realmente quer fazer é tender esses números ao longo do tempo, portanto, se você vir um grande pico em qualquer uma das proporções, algo foi implantado que não está usando os planos de consulta corretamente (idealmente, isso é detectado durante o teste) - use o Shark's consultas de análise para encontrar os culpados. Além disso, aqui está um para encontrar consultas recompiladas com frequência:

    SELECT TOP 50
        qs.plan_generation_num,
        qs.execution_count,
        qs.statement_start_offset,
        qs.statement_end_offset,
        st.text
        FROM sys.dm_exec_query_stats qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
        WHERE qs.plan_generation_num > 1
        ORDER BY qs.plan_generation_num DESC
    

    Se você também estiver gravando estatísticas para uso da CPU, todas as estatísticas podem ser correlacionadas para descobrir o quanto dói e o quanto suas correções ajudam. Na prática, descobri que mesmo uma única estratégia de plano de consulta ruim em um sproc central pode deixar um servidor de joelhos; obviamente YMMV.

    • 11

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