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 / 175073
Accepted
Tara Kizer
Tara Kizer
Asked: 2017-06-01 10:45:33 +0800 CST2017-06-01 10:45:33 +0800 CST 2017-06-01 10:45:33 +0800 CST

Os gatilhos compilam toda vez?

  • 772

Estamos solucionando um servidor que tem alta utilização da CPU. Depois de descobrir que as consultas não estavam causando isso, começamos a procurar compilações.

O Monitor de desempenho está mostrando menos de 50 compilações/s e menos de 15 recompilações/s.

Depois de executar uma sessão XE procurando por compilações, estamos vendo milhares de compilações por segundo.

Este sistema está usando gatilhos para auditar mudanças. A maioria das compilações são devido a gatilhos. Os gatilhos fazem referência a sys.dm_tran_active_transactions.

Nosso primeiro pensamento foi que talvez referenciar um DMV em um gatilho faria com que ele compilasse todas as vezes, ou talvez apenas esse DMV específico o causasse. Então comecei a testar essa teoria. Ele compila toda vez, mas eu não verifiquei se um gatilho compila toda vez que é acionado quando não faz referência ao DMV e, em vez disso, codifica um valor. Ele ainda estava compilando cada vez que era acionado. Soltar o gatilho interrompe as compilações.

  1. Estamos usando sqlserver.query_pre_execution_showplan em uma sessão XE para rastrear as compilações. Por que há uma discrepância entre isso e o contador PerfMon?
  2. É normal que você receba um evento de compilação toda vez que um gatilho é executado?

Reproduzir script:

CREATE TABLE t1 (transaction_id int, Column2 varchar(100));
CREATE TABLE t2 (Column1 varchar(max), Column2 varchar(100));
GO

CREATE TRIGGER t2_ins
ON t2
AFTER INSERT
AS

INSERT INTO t1
SELECT (SELECT TOP 1 transaction_id FROM sys.dm_tran_active_transactions), Column2
FROM inserted;
GO

--Both of these show compilation events
INSERT INTO t2 VALUES ('row1', 'value1');
INSERT INTO t2 VALUES ('row2', 'value2');
GO

ALTER TRIGGER t2_ins
ON t2
AFTER INSERT
AS

INSERT INTO t1
SELECT 1000, Column2
FROM inserted;
GO

--Both of these show compilation events
INSERT INTO t2 VALUES ('row3', 'value3');
INSERT INTO t2 VALUES ('row4', 'value4');

DROP TRIGGER t2_ins;

--These do not show compilation events
INSERT INTO t2 VALUES ('row5', 'value5');
INSERT INTO t2 VALUES ('row6', 'value6');

DROP TABLE t1, t2;
sql-server trigger
  • 2 2 respostas
  • 3351 Views

2 respostas

  • Voted
  1. Best Answer
    Jonathan Kehayias
    2017-06-02T07:14:48+08:002017-06-02T07:14:48+08:00

    O evento XE que está sendo usado está levando você a pensar incorretamente que o gatilho está compilando cada execução. Existem dois eventos estendidos query_pre_execution_showplan e query_post_compilation_showplan que possuem descrições semelhantes, mas diferem por uma palavra importante:

    query_pre_execution_showplan

    Ocorre depois que uma instrução SQL é compilada. Esse evento retorna uma representação XML do plano de consulta estimado que é gerado quando a consulta é otimizada . O uso desse evento pode ter uma sobrecarga de desempenho significativa, portanto, ele deve ser usado apenas ao solucionar problemas ou monitorar problemas específicos por breves períodos de tempo.

    query_post_compilation_showplan

    Ocorre depois que uma instrução SQL é compilada. Esse evento retorna uma representação XML do plano de consulta estimado que é gerado quando a consulta é compilada . O uso desse evento pode ter uma sobrecarga de desempenho significativa, portanto, ele deve ser usado apenas ao solucionar problemas ou monitorar problemas específicos por breves períodos de tempo.

    Os eventos não são exatamente os mesmos na descrição e ocorrem em momentos diferentes de outros testes usando sua reprodução. Usando uma definição de sessão de evento muito maior, é fácil ver onde as compilações realmente estão acontecendo.

    insira a descrição da imagem aqui

    Aqui você pode ver a primeira compilação acontecendo para as instruções de inserção como planos preparados sendo parametrizados automaticamente na caixa verde. O gatilho é compilado na caixa vermelha e o plano é inserido no cache conforme mostrado pelo evento sp_cache_insert. Em seguida, na caixa laranja, a execução do gatilho obtém um acerto de cache e reutiliza o plano de gatilho para a segunda instrução INSERT no lote, portanto, não está compilando todas as execuções do comando INSERT e o plano é reutilizado, como você pode ver com o evento sp_cache_hit para o gatilho.

    Se executarmos as duas instruções INSERT individualmente novamente após a primeira execução, o gatilho não compilará novamente conforme mostrado nos eventos abaixo:

    insira a descrição da imagem aqui

    Aqui, a primeira instrução encontra uma ocorrência de cache para a versão parametrizada automaticamente preparada da instrução em cache, mas uma falha para o lote ad hoc que foi enviado. O gatilho recebe um acerto de cache e não compila novamente, conforme mostrado no bloco vermelho de eventos. O bloco verde de eventos repete esse comportamento para a segunda instrução INSERT executada como um lote separado. No entanto, em todos os casos, você ainda vê o disparo do evento query_pre_execution_showplan, que só posso atribuir à diferença de ser otimizado versus compilado na descrição do evento, mas o gatilho não está compilando para cada execução, conforme mostrado por essas séries de eventos.

    • 20
  2. Robert L Davis
    2017-06-01T10:56:35+08:002017-06-01T10:56:35+08:00

    Não. Os gatilhos nem sempre são recompilados. Instruções de consulta simples, no entanto, não têm seus planos armazenados em cache e, portanto, sempre seriam recompilados.

    Os gatilhos são recompilados se o número de linhas inseridas ou excluídas mudar significativamente. Consulte: https://technet.microsoft.com/en-us/library/ms181055.aspx

    Não sei se eles têm o mesmo em XEvents, mas no SQL Trace, uma recompilação tem uma subclasse de evento que informa por que foi recompilada. Isso está explicado no mesmo link acima.

    • 13

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

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

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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