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 / 280998
Accepted
D-K
D-K
Asked: 2020-12-07 09:17:44 +0800 CST2020-12-07 09:17:44 +0800 CST 2020-12-07 09:17:44 +0800 CST

SQL Server - Posso remover cirurgicamente um plano de consulta em cache incorreto ou estou perseguindo a ideia errada?

  • 772

Deixe-me preparar o palco:

  • SQL Server > 2016
  • Vários bancos de dados com os mesmos esquemas
  • Os dados são semelhantes, mas não idênticos
  • Os mesmos índices existem etc., todos os sistemas, exceto um, funcionam como esperado
  • O exame do plano de execução recomenda a criação de um índice com TODAS as colunas como INCLUDE. A mesma coluna base já existe sem as inclusões.

O problema:

  • Em UM dos bancos de dados, o mecanismo de consulta não utiliza um índice existente e usa uma verificação completa da tabela
  • Executando manualmente a consulta (que usa um parâmetro) - varredura completa da tabela!
  • Executando manualmente a consulta sem um parâmetro (data fixa usada) - usa o índice.
  • Executando manualmente a consulta com um parâmetro e adicionando WITH (INDEX(update_ts_INDEX))- usa o índice. A consulta vai de 2 minutos a menos de um segundo.

Hipótese:

  • Acredito que o cache de consulta possa estar corrompido - mas não sei se isso é possível. Por comércio, sou um desenvolvedor java que passou os últimos 3 anos investigando o ajuste de desempenho do servidor SQL, etc.
  • O fato de executar manualmente a consulta sem um parâmetro - o mecanismo de consulta escolhe o índice certo - me impressiona. Ideias?

Notas:

  • Nos outros servidores, que executam o mesmo código e consultas, não consigo encontrar nenhuma evidência de que essa mesma consulta esteja demorando. Eles devem estar usando o índice.
  • Acabei de executar o comando manualmente, em outra região com um parâmetro, e ele usou o índice, então o problema está de fato em APENAS uma região - um banco de dados.

Exemplo de consulta:

DECLARE @P1 DATETIME = GETDATE() - .1;

SELECT value_1, update_ts, value_2 FROM PRODUCTION_TABLE 
WHERE (PRODUCTION_TABLE.update_ts > @P1);

Se eu remover a variável e codificar manualmente uma data, ela usará o index.

Pergunta: Posso remover cirurgicamente um plano de consulta em cache incorreto para essa consulta específica?

--- ATUALIZAR ---

O uso OPTION (RECOMPILE)faz com que o mecanismo de consulta escolha o índice correto.

sql-server query-performance
  • 2 2 respostas
  • 646 Views

2 respostas

  • Voted
  1. Henrique Donati
    2020-12-07T09:30:32+08:002020-12-07T09:30:32+08:00

    Você pode!

    Execute isto para encontrar o ID do seu plano:

    select plan_handle, creation_time, last_execution_time, execution_count, qt.text
    FROM 
       sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text (qs.[sql_handle]) AS qt
    

    Em seguida, coloque esse ID no procedimento armazenado chamado DBCC FREEPROCCACHE

    DBCC FREEPROCCACHE (plan_handle_id_goes_here)
    

    Você sempre pode simplesmente liberar a coisa toda. Ele adicionará alguns segundos à primeira vez que cada consulta for executada, mas não mais do que uma redefinição de servidor (ou um IISRESEt em um servidor da Web) faria de qualquer maneira.

    É assim que você limpa tudo:

    DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;
    

    Verifique aqui para mais informações https://serverfault.com/questions/91285/how-do-i-remove-a-specific-bad-plan-from-the-sql-server-query-cache

    • 2
  2. Best Answer
    Graham
    2020-12-07T10:49:06+08:002020-12-07T10:49:06+08:00

    Seu plano provavelmente não é corrupto, por si só. Seus dados provavelmente não gostam de ter uma distribuição uniforme de dados para esse campo, e o plano provavelmente foi criado usando um valor discrepante (ou seu código é excessivamente complexo, mas acho que não, com base em sua amostra. Se for complexo, comece com uma refatoração). Deixando de lado o Query Store, os planos são descartados quando os servidores são reiniciados, há pressões de memória etc. Em seguida, eles são recriados, geralmente com base nos parâmetros que você fornece, que podem ou não ser discrepantes.

    Você tem algumas opções com base nas circunstâncias.

    Se você tiver o Query Store, use-o. Solte o plano, execute novamente com um valor representativo e fixe-o. Como observado acima, o problema de remover um plano voltado para um valor discrepante é que há uma chance de ele voltar. Fixar um plano evita isso completamente.

    Se este for um bit de SQL executado com pouca frequência (algumas vezes por hora) e for executado por uma quantidade razoável de tempo (mais de alguns segundos, o que parece), basta recriar um novo plano a cada vez e o código é não muito complexo; as economias potenciais valem o custo. OPTION RECOMPIE

    Se, no entanto, você tiver um valor representativo geral para seu parâmetro, poderá adicionar a OPTIMIZE FOR @var = '2020-01-01'dica de consulta. Isso significa que quando um novo plano é gerado novamente, ele não usará o valor fornecido para determinar o plano, mas o valor fornecido. Tenha em mente que quando você atinge um valor discrepante (por exemplo, NULLs em algumas vezes campos NULLABLE), você não obterá o plano ideal. Esta é a rota que eu tenho seguido com mais frequência em circunstâncias semelhantes e, no seu caso, eu simplesmente codificaria uma data recente (se isso fizer sentido).

    Há outras coisas que você pode fazer, mas na minha experiência o valor delas cai drasticamente rapidamente.

    • 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