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 / user-98571

Tara Kizer's questions

Martin Hope
Tara Kizer
Asked: 2017-06-01 10:45:33 +0800 CST

Os gatilhos compilam toda vez?

  • 22

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 respostas
  • 3351 Views
Martin Hope
Tara Kizer
Asked: 2017-03-15 10:54:56 +0800 CST

Planos de execução ausentes para procedimentos armazenados

  • 17

Quais são os motivos para um plano estar ausente do cache para procedimentos armazenados?

  1. WITH RECOMPILE
  2. SQL dinâmico
  3. Código criptografado
  4. Mudanças significativas de dados
  5. Atualizar estatísticas
  6. O que mais?

Eu trabalhei em 2 servidores (SQL Server 2008 R2 e SQL Server 2012) recentemente que não tinham planos em cache para procedimentos armazenados com muitos recursos. Muitas, talvez todas, as instruções dentro dos procedimentos armazenados também não tinham planos em cache. Alguns dos procedimentos armazenados são executados com bastante frequência, algumas vezes por segundo.

Nenhuma pressão de memória. Um dos servidores tem muito mais hardware do que o necessário.

Eu pensei que os planos ausentes eram devido a criações de tabelas temporárias no meio dos procedimentos armazenados, mas isso parece ser uma informação antiga do SQL Server 2000 ou anterior. A partir do SQL Server 2005, as recompilações acontecem no nível de instrução para as instruções após o DDL. Isso é verdade em todos os casos ou ainda pode acontecer em versões mais recentes?

O que mais poderia ser o culpado pelos planos ausentes? Eu dei uma olhada em alguns artigos sobre este tópico, mas nada parece se encaixar.

Otimizar para cargas de trabalho adhoc está habilitado no servidor que estou analisando esta semana. Um dos procedimentos armazenados é executado apenas uma vez por dia. Eu tenho o código para isso. Não tenho o código para aquele que está sendo executado mais de 100 vezes por minuto, mas posso obtê-lo. Não poderei postar o código, mas posso descrevê-lo em relação à minha pergunta.

Não acredito que alguém esteja liberando o cache de procedimento ou descartando buffers limpos. Este cliente está usando o Solarwinds DPA como uma de suas ferramentas de monitoramento. O DPA capturou um dos planos de execução para a instrução no proc armazenado que é chamado uma vez por dia. Essa declaração tem uma quantidade enorme de leituras devido à WHEREcláusula não-sargável. Se o DPA capturou a instrução, então é um plano estimado e estava no cache do plano ao mesmo tempo. Simplesmente não está lá quando estamos solucionando problemas. Vou fazer com que eles comecem a se registrar sp_WhoIsActiveem uma mesa.

estou usando sp_BlitzCache. (Eu trabalho para Brent Ozar Unlimited) Isso mostrará o plano para todo o procedimento armazenado, bem como os planos para as instruções individuais, se existirem. Se eles não existirem, haverá um aviso "Não foi possível encontrar um plano para esta consulta. Os possíveis motivos para isso incluem SQL dinâmico, RECOMPILEdicas e código criptografado". E esse aviso está nas declarações também.

TF 2371 não está no lugar. Estou olhando para as estatísticas de espera. O servidor está bastante entediado. O PLE é superior a 130.000.

Agora tenho o código para mais 2 procedimentos armazenados. Um deles é usar SQL dinâmico exec (@sql)para que saibamos porque não existe um plano para isso. Mas o outro, e este é o que está rodando mais de 100 vezes por minuto, não tem nada fora do comum. A única coisa que se destaca nesse é que as tabelas temporárias estão sendo criadas no meio de mais de 1000 linhas de código. Ele também chama um monte de procedimentos armazenados filhos.

Em relação ao Plan Caching no SQL Server 2008 , não estou vendo nenhum literal >= 8k, mas um dos procedimentos armazenados tem um comentário sobre uma inserção em massa logo antes de chamar outro procedimento armazenado. Mas a inserção em massa não aparece no procedimento armazenado externo que estou vendo. A seção "Limiar de recompilação" do artigo é interessante. O que estou vendo para as tabelas temporárias são toneladas de INSERTs (que podem resultar em milhões de linhas), algumas atualizações e exclusões. Portanto, muitos dados são alterados nas tabelas temporárias. Milhões.

sql-server plan-cache
  • 2 respostas
  • 7645 Views

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