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-418

Marian's questions

Martin Hope
Marian
Asked: 2018-05-01 11:36:48 +0800 CST

Pesquisa interminável no repositório de consultas

  • 13

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 respostas
  • 1654 Views
Martin Hope
Marian
Asked: 2011-05-31 05:04:30 +0800 CST

Como corrigir discrepâncias entre os dados do editor e da assinatura?

  • 6

Tenho uma replicação transacional entre dois servidores SQL Server 2008 SP1, ambos no Windows 2003 Server. Descobri que existem discrepâncias entre algumas das tabelas do banco de dados principal e o banco de dados de assinatura. Fiz uma validação manual nas contagens de registros e há pequenas diferenças. Eu sei que há uma latência entre os dois lados, então não é para se preocupar muito, mas há uma tabela específica que não irá sincronizar, não importa o quê (novas linhas aparecem, mas algumas linhas antigas específicas não aparecem, então elas parecem foram removidos após a sincronização).

A situação é que o banco de dados de assinatura não é somente leitura, portanto, um aplicativo pode ler e também gravar dados nesse banco de dados.

Agora eu gostaria de saber quais soluções você usaria para sincronizar os dois lados. Eu posso pensar em dois agora:

  • use o utilitário tablediff.exe para cada artigo para comparar tabelas de origem e destino e gerar scripts

  • reinicialize a assinatura para que ela invalide o último instantâneo e gere um novo.

Existem outras soluções para corrigir isso?

sql-server-2008 replication
  • 1 respostas
  • 2380 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