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 / 231682
Accepted
James Jenkins
James Jenkins
Asked: 2019-03-09 10:10:04 +0800 CST2019-03-09 10:10:04 +0800 CST 2019-03-09 10:10:04 +0800 CST

O que é 'memória de log' no Query Store 2017

  • 772

No SQL 2017 existe uma nova métrica de execução, 'memória de log' diferente da que foi adicionada em 2017 não estou encontrando nada a respeito.

Métrica de execução: (SQL 2017)

Tempo de CPU, duração, contagem de execução, leituras lógicas, gravações lógicas, consumo de memória, leituras físicas, tempo de CLR, grau de paralelismo (DOP), contagem de linhas, memória de log, memória TempDB e tempos de espera

Acredito que entendo quais são todas as outras métricas e por que devo me importar.

Executei todas as métricas para as 5 principais consultas de consumo de recursos, durante vários períodos específicos. Gravei e agora estou examinando os resultados. Eu sei que os valores ( muito grandes ) para 'memória de log' estão em KB.

O que exatamente é a métrica 'memória de log'?

Editar, tendo recebido duas respostas que verifiquei

A resposta do LowlyDBA sugere que é uma combinação de 5 campos relacionados desys.query_store_runtime_stats

Usando o código para validar fornecido por jadarnel27 em sua resposta

Criei o banco de dados '231682' e executei a consulta de teste para os 5 campos, obtive resultados muito semelhantes

231682-Dados

Eu somei ( usado =SUM()no Excel ) meus valores e obtive 1.383.040 (bytes)

Eu olhei no Query Store, para Log memory used (KB), ele mostra um valor de 354.058.240 (KB), esse número é ordens de magnitude maior, também é KB em comparação com bytes, em bytes seria 354.058.240.000 (bytes)

231682-QS

Eu somei os totais de todos os campos e obtive apenas 1.655.236 (byte)

SELECT *
FROM sys.query_store_runtime_stats qsrs
WHERE qsrs.avg_log_bytes_used > 0;

Suspeito que a resposta à minha pergunta é que a métrica 'memória de log' no SQL 2017 não é nenhum valor real. O valor apresentado neste pequeno experimento seria de 354 GB, um valor irrealisticamente alto.

sql-server sql-server-2017
  • 2 2 respostas
  • 481 Views

2 respostas

  • Voted
  1. LowlyDBA - John M
    2019-03-09T11:24:00+08:002019-03-09T11:24:00+08:00

    Se observarmos a documentação do objeto subjacente, sys.query_store_runtime_stats, veremos que ele tem as seguintes descrições:

    • avg_log_bytes_used - Número médio de bytes no log do banco de dados usado pelo plano de consulta, dentro do intervalo de agregação.
      Observação: o Azure SQL Data Warehouse sempre retornará zero (0).
    • last_log_bytes_used - Número de bytes no log do banco de dados usados ​​pela última execução do plano de consulta, dentro do intervalo de agregação.
      Observação: o Azure SQL Data Warehouse sempre retornará zero (0).
    • min_log_bytes_used - Número mínimo de bytes no log do banco de dados usado pelo plano de consulta, dentro do intervalo de agregação.
      Observação: o Azure SQL Data Warehouse sempre retornará zero (0).
    • max_log_bytes_used - Número máximo de bytes no log do banco de dados usado pelo plano de consulta, dentro do intervalo de agregação.
      Observação: o Azure SQL Data Warehouse sempre retornará zero (0).
    • stdev_log_bytes_used - Desvio padrão do número de bytes no log do banco de dados usado por um plano de consulta, dentro do intervalo de agregação.
      Observação: o Azure SQL Data Warehouse sempre retornará zero (0).
    • 10
  2. Best Answer
    Josh Darnell
    2019-03-09T17:19:53+08:002019-03-09T17:19:53+08:00

    A resposta do LowlyDBA cobre o que as métricas realmente significam. Esta resposta é apenas para explicar por que os números na interface do usuário do Query Store não fazem totalmente sentido.

    Obtendo alguns dados de registro

    Primeiro, vamos obter dados nessas colunas no SQL Server 2017 Developer Edition no meu laptop.

    Crie um banco de dados:

    USE [master];
    GO
    
    CREATE DATABASE [231682];
    GO
    

    Habilite o Query Store com configurações muito impraticáveis:

    ALTER DATABASE [231682] SET QUERY_STORE = ON (INTERVAL_LENGTH_MINUTES = 1);
    

    Faça algo que gere algum uso do log de transações:

    USE [231682];
    
    CREATE TABLE dbo.Junk
    (
        Id INT NOT NULL,
        MoreJunk NVARCHAR(MAX) NOT NULL
    );
    
    INSERT INTO dbo.Junk
        (Id, MoreJunk)
    SELECT TOP 1000
        m.message_id, m.[text]
    FROM sys.messages m;
    

    Forçar a liberação para o disco caso ainda não tenha acontecido:

    EXEC sp_query_store_flush_db;
    

    Voilá:

    SELECT 
        qsrs.avg_log_bytes_used, 
        qsrs.last_log_bytes_used, 
        qsrs.min_log_bytes_used, 
        qsrs.max_log_bytes_used, 
        qsrs.stdev_log_bytes_used
    FROM sys.query_store_runtime_stats qsrs
    WHERE qsrs.avg_log_bytes_used > 0;
    

    captura de tela de resultados com dados diferentes de zero

    Problema de cálculo

    Do ponto de vista da interface do usuário do repositório de consultas, o cálculo que está sendo executado é assim:

    SELECT TOP (@results_row_count)
        -- other columns
        ROUND(CONVERT(float, SUM(rs.avg_log_bytes_used*rs.count_executions))*1024,2) total_log_bytes_used,
        -- other columns
    FROM sys.query_store_runtime_stats rs
        JOIN sys.query_store_plan p ON p.plan_id = rs.plan_id
        JOIN sys.query_store_query q ON q.query_id = p.query_id
        JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
    WHERE NOT (rs.first_execution_time > @interval_end_time OR rs.last_execution_time < @interval_start_time)
    GROUP BY p.query_id, qt.query_sql_text, q.object_id
    HAVING COUNT(distinct p.plan_id) >= 1
    ORDER BY total_log_bytes_used DESC
    

    Há um bug no cálculo, ele deveria estar dividindo por 1.024 para ir de bytes para kilobytes. Do jeito que está, está multiplicando os bytes por 1.024 e, em seguida, relatando-os como kilobytes - o que faz com que pareçam estar desligados por um fator de ~ 1.000.000.

    Por exemplo, meu repro aqui produziu 346.796 bytes de log em 1 execução da consulta. A interface do usuário do Repositório de Consultas, em vez de mostrar 338 kilobytes, mostra 355.119.104 kilobytes.

    Relatei esse problema à Microsoft: o cálculo da métrica "Memória de log usada" do Query Store está errado

    • 6

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