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 / 337766
Accepted
J. Mini
J. Mini
Asked: 2024-03-16 22:14:20 +0800 CST2024-03-16 22:14:20 +0800 CST 2024-03-16 22:14:20 +0800 CST

Como posso verificar se o isolamento de instantâneo de leitura confirmada está causando problemas de aplicativo que a leitura confirmada não causaria?

  • 772

Suponha que eu tenha ativado o RCSI e meu servidor esteja funcionando bem; Não houve picos no uso de recursos e o aumento da carga no tempdb foi mínimo. Tudo isso é bom, mas como posso saber se a mudança causou problemas aos meus usuários? Por exemplo, com a finalidade de encontrar problemas causados ​​pelo RSCI que o Read Committed não teria causado, existe algum:

  • Mensagens de erro que posso rastrear?
  • Scripts de diagnóstico que posso executar?
  • Métricas a serem observadas?
  • Registrando os desenvolvedores de aplicativos podem colocar seu próprio código?
  • Reclamações específicas de usuários para as quais devo estar alerta?

Estou muito feliz em usar o RCSI, mas o objetivo desta pergunta é encontrar maneiras práticas de rastrear o impacto de ativá-lo após o fato.

sql-server
  • 1 1 respostas
  • 72 Views

1 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2024-03-19T02:47:54+08:002024-03-19T02:47:54+08:00

    escopo

    Esta é uma pergunta difícil de responder e de considerar todos os problemas possíveis, porque quase todas as cargas de trabalho possuem características únicas que requerem atenção especial. Alguns podem funcionar perfeitamente usando níveis de isolamento otimistas, e outros requerem intervenção em determinadas áreas.

    Na maioria dos casos, um único nível de isolamento não é 100% adequado para qualquer carga de trabalho, mas o descuido do desenvolvedor, a ingenuidade etc. podem resultar no uso de níveis de isolamento incorretos. Se isso causa algum problema ou não, geralmente é uma questão de sorte ou falta de simultaneidade.

    Mensagens de erro que posso rastrear?

    Para RCSI, os únicos erros que encontrei foram relacionados ao preenchimento/falta de espaço do armazenamento de versão. Você pode ter uma ideia do que procurar pesquisando nas mensagens de erro disponíveis:

    SELECT
        m.*
    FROM sys.messages AS m
    WHERE m.language_id = 1033
    AND   m.text LIKE '%[v-V]ersion [s-S]tore%'
    ORDER BY
        m.message_id;
    

    Se você estivesse falando sobre Snapshot Isolation, sua maior preocupação seriam os conflitos de atualização:

    SELECT
        m.*
    FROM sys.messages AS m
    WHERE m.language_id = 1033
    AND   m.message_id = 3960
    ORDER BY
        m.message_id;
    

    Transação de isolamento de instantâneo abortada devido a conflito de atualização. Você não pode usar o isolamento de snapshot para acessar a tabela '%.*ls' direta ou indiretamente no banco de dados '%.*ls' para atualizar, excluir ou inserir a linha que foi modificada ou excluída por outra transação. Tente novamente a transação ou altere o nível de isolamento da instrução de atualização/exclusão.

    Mas esse é um cenário totalmente diferente.

    Scripts de diagnóstico que posso executar?

    Isso depende do que você está tentando diagnosticar. Mais comumente, seria "o que está usando o armazenamento de versão e quanto ele está usando?"

    Aqui está um fragmento de código de sp_PressureDetector , ligeiramente reformatado para respeitar o comprimento da resposta:

    SELECT
        free_space_gb =
            CONVERT(decimal(38, 2), SUM(d.unallocated_extent_page_count * 8.) / 1024. / 1024.),
        user_objects_gb =
            CONVERT(decimal(38, 2), SUM(d.user_object_reserved_page_count * 8.) / 1024. / 1024.),
        version_store_gb =
            CONVERT(decimal(38, 2), SUM(d.version_store_reserved_page_count * 8.) / 1024. / 1024.),
        internal_objects_gb =
            CONVERT(decimal(38, 2), SUM(d.internal_object_reserved_page_count * 8.) / 1024. / 1024.)
    FROM tempdb.sys.dm_db_file_space_usage AS d
    WHERE d.database_id = 2;
    

    Se você estiver no SQL Server 2017 ou superior, poderá verificar usando algo assim:

    SELECT
        d.name,
        reserved_page_count,
        reserved_space_gb = 
            CONVERT(decimal(38, 2), reserved_space_kb / 1024. / 1024.)
    FROM sys.dm_tran_version_store_space_usage AS t
    JOIN sys.databases AS d
      ON t.database_id = d.database_id;
    

    Observe que eles monitoram apenas o tamanho do armazenamento de versão em tempdb . Se você estiver no SQL Server 2019+ e usando a Recuperação Acelerada de Banco de Dados, você desejará monitorar o Armazenamento de Versão Persistente.

    SELECT
        d.name,
        persistent_version_store_size_gb = 
            CONVERT(decimal(38, 2), persistent_version_store_size_kb / 1024. / 1024.)
    FROM sys.dm_tran_persistent_version_store_stats AS t
    JOIN sys.databases AS d
      ON t.database_id = d.database_id;
    

    Métricas a serem observadas?

    Além do tamanho do armazenamento de versões, você também pode querer observar transações de longa duração usando o Armazenamento de versões. Algo assim pode fornecer detalhes suficientes:

    SELECT
        at.transaction_id,
        at.name,
        at.transaction_begin_time,
        at.transaction_type,
        at.transaction_state,
        dt.is_snapshot,
        dt.first_snapshot_sequence_num,
        dt.max_version_chain_traversed,
        dt.average_version_chain_traversed,
        dt.elapsed_time_seconds
    FROM sys.dm_tran_active_transactions AS at
    OUTER APPLY
    (
        SELECT TOP (1)
               dt.*
        FROM sys.dm_tran_active_snapshot_database_transactions AS dt
        WHERE dt.transaction_id = at.transaction_id
        ORDER BY
            dt.elapsed_time_seconds DESC
    ) AS dt
    ORDER BY
        at.transaction_begin_time DESC;
    

    Em geral, você gostaria de procurar transações de longa duração que possam estar impedindo a limpeza do armazenamento de versões.

    Registrando os desenvolvedores de aplicativos podem colocar seu próprio código?

    Não consigo pensar em nada que possa ser útil.

    Reclamações específicas de usuários para as quais devo estar alerta?

    Você gostaria de ficar de olho nas reclamações dos usuários sobre resultados incorretos ou entradas duplicadas.

    Tentando ser conciso aqui, pode haver áreas do aplicativo que são sensíveis à simultaneidade, onde o bloqueio é necessário para a correção dos resultados que o bloqueio de leitura confirmada fornece.

    Eu sugiro ver exemplos nestas postagens de Paul White:

    • Modificações de dados sob isolamento de instantâneo confirmado por leitura
    • O nível de isolamento SNAPSHOT
    • O nível de isolamento de leitura confirmada
    • Tabelas de sequência

    Em particular, os detalhes de quais garantias de consistência você está obtendo atualmente com o bloqueio de leitura confirmada como o nível de isolamento e como as modificações de dados podem obter resultados estranhos no isolamento de instantâneo confirmado de leitura. Consultas sensíveis a leituras obsoletas podem ter uma dica READCOMMITTEDLOCK aplicada, conforme mostrado no artigo da tabela de sequência.

    • 2

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