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 / 205389
Accepted
Marian
Marian
Asked: 2018-05-01 11:36:48 +0800 CST2018-05-01 11:36:48 +0800 CST 2018-05-01 11:36:48 +0800 CST

Pesquisa interminável no repositório de consultas

  • 772

Direi desde o início que minha pergunta/problema é semelhante a esta anterior, mas como não tenho certeza se a causa ou a informação inicial é a mesma, decidi postar minha pergunta com mais alguns detalhes.

Questão em mãos:

  • em uma hora estranha (perto do final do dia útil) uma instância de produção começa a se comportar de forma irregular:
    • CPU alta para a instância (de uma linha de base de ~ 30%, foi quase o dobro e ainda estava crescendo)
    • aumento do número de transações/s (embora o carregamento do aplicativo não tenha sofrido nenhuma alteração)
    • aumento do número de sessões inativas
    • eventos de bloqueio estranhos entre sessões que nunca exibiram esse comportamento (mesmo as sessões não confirmadas de leitura estavam causando bloqueio)
    • as principais esperas pelo intervalo foram sem travamento de página em 1º lugar, com bloqueios em 2º lugar

Investigação inicial:

  • usando sp_whoIsActive vimos que uma consulta executada por nossa ferramenta de monitoramento resolve ficar extremamente lenta e consumir muita CPU, algo que não acontecia antes;
  • seu nível de isolamento foi lido como não confirmado;
  • analisamos o plano e vimos números malucos: StatementEstRows="3.86846e+010" com cerca de 150 TB de dados estimados a serem retornados
  • suspeitamos que um recurso de monitoramento de consultas da ferramenta de monitoramento fosse a causa, então desativamos o recurso (também abrimos um ticket com nosso provedor para verificar se eles estão cientes de algum problema)
  • a partir desse primeiro evento, aconteceu mais algumas vezes, a cada vez que matamos a sessão, tudo volta ao normal;
  • percebemos que a consulta é extremamente semelhante a uma das consultas usadas pelo MS em BOL para monitoramento do Query Store - Consultas que recentemente regrediram no desempenho (comparando diferentes pontos no tempo)
  • executamos a mesma consulta manualmente e vemos o mesmo comportamento (CPU usado cada vez maior, aumentando as esperas de trava, bloqueios inesperados etc.)

Pergunta culpada:

Select qt.query_sql_text, 
    q.query_id, 
    qt.query_text_id, 
    rs1.runtime_stats_id AS runtime_stats_id_1,
    interval_1 = DateAdd(minute, -(DateDiff(minute, getdate(), getutcdate())), rsi1.start_time), 
    p1.plan_id AS plan_1, 
    rs1.avg_duration AS avg_duration_1, 
    rs2.avg_duration AS avg_duration_2,
    p2.plan_id AS plan_2, 
    interval_2 = DateAdd(minute, -(DateDiff(minute, getdate(), getutcdate())), rsi2.start_time), 
    rs2.runtime_stats_id AS runtime_stats_id_2
From sys.query_store_query_text AS qt 
Inner Join sys.query_store_query AS q 
    ON qt.query_text_id = q.query_text_id 
Inner Join sys.query_store_plan AS p1 
    ON q.query_id = p1.query_id 
Inner Join sys.query_store_runtime_stats AS rs1 
    ON p1.plan_id = rs1.plan_id 
Inner Join sys.query_store_runtime_stats_interval AS rsi1 
    ON rsi1.runtime_stats_interval_id = rs1.runtime_stats_interval_id 
 Inner Join sys.query_store_plan AS p2 
    ON q.query_id = p2.query_id 
Inner Join sys.query_store_runtime_stats AS rs2 
    ON p2.plan_id = rs2.plan_id 
Inner Join sys.query_store_runtime_stats_interval AS rsi2 
    ON rsi2.runtime_stats_interval_id = rs2.runtime_stats_interval_id
Where rsi1.start_time > DATEADD(hour, -48, GETUTCDATE()) 
    AND rsi2.start_time > rsi1.start_time 
    AND p1.plan_id <> p2.plan_id
    AND rs2.avg_duration > rs1.avg_duration * 2
Order By q.query_id, rsi1.start_time, rsi2.start_time

Configurações e informações:

  • SQL Server 2016 SP1 CU4 Enterprise em um cluster do Windows Server 2012R2
  • Repositório de consultas habilitado e configurado como padrão (nenhuma configuração alterada)
  • banco de dados importado de uma instância do SQL 2005 (e ainda no nível de compatibilidade 100)

Observação empírica:

  • devido a estatísticas extremamente malucas, pegamos todos os objetos *plan_persist** usados ​​no plano mal estimado (nenhum plano real ainda, porque a consulta nunca foi concluída) e verificamos as estatísticas, alguns dos índices usados ​​no plano não tinham estatísticas (DBCC SHOWSTATISTICS não retornou nada, select from sys.stats mostrou a função NULL stats_date() para alguns índices

Solução rápida e suja:

  • criar manualmente estatísticas ausentes em objetos do sistema relacionados ao Query Store ou
  • forçar a execução da consulta usando o novo CE (traceflag) - que também criará/atualizará as estatísticas necessárias ou
  • altere o nível de compatibilidade do banco de dados para 130 (para que, por padrão, use o novo CE)

Então, minha verdadeira pergunta seria:

Por que uma consulta no Query Store causaria problemas de desempenho em toda a instância? Estamos em um território de bugs com o Query Store?

PS: Vou fazer upload de alguns arquivos (print screens, IO stats e planos) em breve.

Arquivos adicionados no Dropbox .

Plano 1 - plano inicial estimado maluco em produção

Plano 2 - plano real, CE antigo, em um ambiente de teste (mesmo comportamento, mesmas estatísticas malucas)

Plano 3 - plano real, novo CE, em um ambiente de teste

sql-server-2016 statistics
  • 2 2 respostas
  • 1654 Views

2 respostas

  • Voted
  1. Best Answer
    Marian
    2018-05-01T12:05:57+08:002018-05-01T12:05:57+08:00

    Como eu disse na resposta, o teste empírico mostrou que havia índices em objetos do sistema sys.plan_persisted* sem nenhuma (nenhuma) estatística criada sobre eles. Suspeito que seja porque o banco de dados é migrado de uma instância do SQL 2005 e mantido por um tempo no nível de compatibilidade 100, portanto, o novo CE não chegou a ser usado.

    Verificação de contagens de linhas:

    Select count(1) from NoNameDB.sys.plan_persist_runtime_stats with (nolock) --60362   
    Select count(1) from NoNameDB.sys.plan_persist_plan with (nolock) --1853    
    Select count(1) from NoNameDB.sys.plan_persist_runtime_stats_interval with (nolock) --671    
    Select count(1) from NoNameDB.sys.plan_persist_query with (nolock) --1091    
    Select count(1) from NoNameDB.sys.plan_persist_query_text with (nolock) --911
    

    Isso mostrou que as estimativas iniciais estavam erradas. Feito com uma conexão DAC, caso contrário as tabelas não estarão disponíveis para consulta.

    Verificação de estatísticas:

    DBCC SHOW_STATISTICS ('sys.plan_persist_runtime_stats_interval', plan_persist_runtime_stats_interval_cidx);    
    DBCC SHOW_STATISTICS ('sys.plan_persist_runtime_stats', plan_persist_runtime_stats_idx1);    
    DBCC SHOW_STATISTICS ('sys.plan_persist_runtime_stats', plan_persist_runtime_stats_cidx);    
    DBCC SHOW_STATISTICS ('sys.plan_persist_plan', plan_persist_plan_cidx);    
    DBCC SHOW_STATISTICS ('sys.plan_persist_plan', plan_persist_plan_idx1);    
    DBCC SHOW_STATISTICS ('sys.plan_persist_query', plan_persist_query_cidx)    
    DBCC SHOW_STATISTICS ('sys.plan_persist_query_text', plan_persist_query_text_cidx);
    

    Isso mostrou que alguns índices tinham estatísticas vazias (ausente, nenhum, zero).

    Correção inicial:

    UPDATE STATISTICS sys.plan_persist_runtime_stats WITH fullscan;
    UPDATE STATISTICS sys.plan_persist_plan WITH fullscan;
    UPDATE STATISTICS sys.plan_persist_runtime_stats_interval WITH fullscan;
    UPDATE STATISTICS sys.plan_persist_query WITH fullscan;
    UPDATE STATISTICS sys.plan_persist_query_text WITH fullscan;
    

    Isso corrigiu as estatísticas e fez a consulta terminar em 10 a 12 segundos.

    Segunda correção :

    (verificado apenas em um ambiente de teste) e provavelmente o correto, pois mostrou as melhores estatísticas para a consulta, foi alterar o nível de compatibilidade do banco de dados para 130. O resultado final foi que a consulta terminou em cerca de 10 a 12 segundos com estatísticas de números normais (10 mil linhas).

    Correção intermediária :

    DBCC TRACEON (2312) -- new CE
    

    Alguma ajuda relacionada sobre estatísticas em tabelas ocultas do sistema.

    • 9
  2. Forrest
    2019-02-28T06:19:55+08:002019-02-28T06:19:55+08:00

    O problema subjacente, que é visível se você abrir o plano real no SSMS e observar o uso da CPU (ou examinar o XML), é o nó 32, um TVF. O culpado nas consultas lentas do Repositório de Consultas é o acesso repetido dos TVFs na memória .

    Custo TVF

    Não importa quantas linhas são retornadas desses TVFs, apenas o número de vezes que eles são acessados. A correção será o que você puder fazer para afastar seus planos de lê-los várias vezes.

    Com base em minha depuração limitada (tanto em habilidades quanto em tempo gasto), minha hipótese é que toda a memória atribuída ao componente específico na memória dos dados do Query Store é verificada a cada execução de TVF. Não consegui afetar essa alocação de memória com sp_query_store_flush_dbou DBCC FREESYSTEMCACHE.

    As soluções alternativas bem-sucedidas até agora incluem guias de plano, dicas ( OPTION(HASH JOIN, LOOP JOIN)funcionou bem o suficiente para mim até agora) e executar as consultas do Query Store em um nó somente leitura de um AG.

    • 5

relate perguntas

  • Obtendo estatísticas de uma tabela no Oracle

  • Método geral rápido para calcular percentis

  • Medianas, Modos, Percentis e OLAP

  • Estimando a distribuição de acesso de linha no mysql

  • O que são estatísticas de banco de dados e como posso me beneficiar delas?

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