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 / 167178
Accepted
Tara Kizer
Tara Kizer
Asked: 2017-03-15 10:54:56 +0800 CST2017-03-15 10:54:56 +0800 CST 2017-03-15 10:54:56 +0800 CST

Planos de execução ausentes para procedimentos armazenados

  • 772

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 2 respostas
  • 7645 Views

2 respostas

  • Voted
  1. Best Answer
    Brent Ozar
    2017-04-08T12:58:45+08:002017-04-08T12:58:45+08:00

    Há dois DMFs de cache de plano:

    sys.dm_exec_query_plan - retorna planos em cache no formato XML, mas apenas até um determinado tamanho (e somente enquanto eles podem ser formatados como XML no SQL Server, o que significa até 128 níveis aninhados).

    sys.dm_exec_text_query_plan - retorna planos em cache em formato de texto, de qualquer tamanho. Mas a desvantagem é que quando os planos são grandes, você não pode convertê-los em XML dentro do SQL Server, e mesmo TRY_CONVERT como XML retorna um nulo.

    sp_BlitzCache atinge apenas o antigo DMV (porque ele precisa analisar planos de consulta como XML para fazer todos os tipos de fatiamento e corte). consultas maiores. No entanto, ainda não poderemos fazer análises XML nele.

    • 6
  2. Stephen MORRIS
    2017-03-31T13:30:56+08:002017-03-31T13:30:56+08:00

    Possivelmente você precisa ajustar o tamanho máximo do XML que pode ser retornado pelo SSMS para uma grade?

    • 1

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