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 / 315097
Accepted
J.D.
J.D.
Asked: 2022-08-02 08:55:31 +0800 CST2022-08-02 08:55:31 +0800 CST 2022-08-02 08:55:31 +0800 CST

Quando ocorrem alterações de DML e DDL em uma tabela temporal, as alterações correlacionadas na tabela de histórico também são registradas no log de transações?

  • 772

Quando as consultas DML e DDL são executadas em uma Tabela Temporal , essas alterações são propagadas adequadamente para a tabela de Histórico correlacionada. Por exemplo, uma UPDATEtabela temporal resulta em um novo registro a ser INSERTinserido na tabela de histórico para refletir essa mudança.

Isso é INSERTpara a tabela de histórico, bem como outras alterações propagadas, registradas no log de transações?

Isso significa que habilitar tabelas temporais efetivamente dobrará a quantidade de dados que passa pelo log de transações (pelo menos para um banco de dados com o modelo de recuperação definido como completo)?

sql-server transaction-log
  • 1 1 respostas
  • 64 Views

1 respostas

  • Voted
  1. Best Answer
    Josh Darnell
    2022-08-04T05:19:39+08:002022-08-04T05:19:39+08:00

    Sim, as alterações na tabela de histórico são registradas.

    Se você pensar na finalidade do log de transações, é permitir a recuperação (por meio de backups e restaurações ou o processo de recuperação normal que ocorre na inicialização do banco de dados). Se as alterações na tabela de histórico não forem registradas, a restauração de um backup de um banco de dados com tabelas temporais provavelmente resultaria em inconsistências entre a tabela principal e a tabela de histórico.

    Aqui está uma pequena demonstração. A configuração cria uma tabela temporal, insere uma linha, atualiza essa linha e limpa o log.

    USE [master];
    GO
    
    DROP DATABASE IF EXISTS [315097];
    GO
    
    CREATE DATABASE [315097];
    ALTER DATABASE [315097] SET RECOVERY SIMPLE 
    GO
    
    USE [315097];
    GO
    
    CREATE TABLE dbo.Employee
    (
        EmployeeID int NOT NULL, 
        [Name] nvarchar(100) NOT NULL, 
        Position varchar(100) NOT NULL, 
        Department varchar(100) NOT NULL, 
        [Address] nvarchar(1024) NOT NULL, 
        AnnualSalary decimal (10,2) NOT NULL, 
        ValidFrom datetime2 GENERATED ALWAYS AS ROW START, 
        ValidTo datetime2 GENERATED ALWAYS AS ROW END,
    
        PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
        CONSTRAINT PK_Employee PRIMARY KEY (EmployeeID)
    )
    WITH 
    (
        SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory)
    );
    GO
    
    /*
    INSERT an initial row to avoid a lot of "noise" in this test related to inserting
    the very first row into these tables
    */
    INSERT INTO dbo.Employee
        (EmployeeID, [Name], Position, Department, [Address], AnnualSalary)
    VALUES
        (1, N'Josh', 'Trusted User', 'I.T.', N'123 Main St', 3.50);
    
    UPDATE dbo.Employee
    SET AnnualSalary = 4.00;
    GO
    
    /*
    Clear the log
    */
    BACKUP DATABASE [315097] TO DISK = N'NUL';
    GO
    CHECKPOINT;
    GO
    /*
    Query showing only checkpoints
    */
    SELECT 
        l.[Current LSN],
        l.Operation,
        l.Context,
        l.AllocUnitName
    FROM fn_dblog(NULL, NULL) l;
    

    Captura de tela dos resultados da consulta no SSMS mostrando apenas 3 registros de log relacionados à operação CHECKPOINT

    Agora, se eu atualizar uma linha na tabela e executar a mesma consulta no log:

    UPDATE dbo.Employee
    SET AnnualSalary = 3.50;
    GO
    

    Captura de tela dos resultados da consulta do SSMS mostrando seis novos registros de log relacionados à atualização da tabela principal e inserção na tabela de histórico

    Esses 6 novos registros de log são:

    • 2 para o início/fim da transação implícita
    • 2 para atualizar o bitmap de backup diferencial
    • 1 para a atualização da tabela base
    • 1 para a inserção "oculta" na tabela de histórico

    Se eu alterar a CREATE TABLEinstrução para remover os itens relacionados ao controle de versão do sistema e executar novamente a demonstração, o estado final do log ficará assim:

    Captura de tela dos resultados da consulta no SSMS mostrando apenas 4 novos registros de log relacionados à atualização da tabela principal

    Isso significa que habilitar tabelas temporais efetivamente dobrará a quantidade de dados que passam pelo log de transações

    Não será exatamente o dobro (inserções na tabela principal não fazem alterações na tabela de histórico), mas sim, haverá um aumento na taxa de transferência do log com certeza.

    • 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