Partilhar via


Tabelas temporais versionadas pelo sistema com tabelas otimizadas para memória

Aplica-se a: SQL Server 2016 (13.x) e posterior Instância Gerenciada SQL do Azure

As tabelas temporais com versão do sistema para tabelas otimizadas para memória fornecem uma solução econômica para cenários em que auditoria de dados e de análise point-in-time são necessários além dos dados coletados com cargas de trabalho OLTP In-Memory.

Observação

As tabelas temporais com otimização de memória só estão disponíveis no SQL Server e na Instância Gerenciada SQL do Azure. Tabelas com otimização de memória e tabelas temporais estão disponíveis independentemente no Banco de Dados SQL do Azure.

Visão geral

As tabelas temporais versionadas pelo sistema mantêm automaticamente um histórico completo das alterações de dados e expõem extensões de Transact-SQL convenientes para análise point-in-time. Em um cenário típico, o histórico de dados é retido por um longo período de tempo (vários meses, até anos), mesmo que não seja consultado regularmente.

A auditoria de dados e a análise baseada no tempo podem ser exigidas em diferentes ambientes, especialmente em sistemas OLTP que processam um número extremamente grande de solicitações e onde In-Memory tecnologia OLTP é usada. No entanto, o uso de tabelas otimizadas para memória em cenários temporais é um desafio porque uma enorme quantidade de dados históricos gerados geralmente excede o limite de RAM disponível. Ao mesmo tempo, usar a RAM para armazenar dados históricos somente leitura que são acessados com menos frequência à medida que envelhecem não é uma solução ideal.

As tabelas temporais versionadas pelo sistema para tabelas otimizadas para memória fornecem uma alta taxa de transferência transacional e concorrência sem bloqueios. Eles oferecem a capacidade de armazenar uma grande quantidade de dados de histórico usando tabelas na memória para armazenar dados atuais (a tabela temporal) e tabelas baseadas em disco para dados históricos. O efeito nas operações DML é reduzido usando uma tabela de preparo interna otimizada para memória gerada automaticamente que armazena o histórico recente e permite que DMLs sejam executadas a partir de código compilado nativamente.

O diagrama a seguir ilustra essa arquitetura.

Diagrama da arquitetura in-memory temporal.

Detalhes da implementação

Ao criar uma tabela com versão do sistema otimizada para memória, esteja ciente das seguintes considerações. Para obter opções de sintaxe e um exemplo, consulte CREATE TABLE.

  • Somente tabelas com otimização de memória durável podem ser versionadas pelo sistema (DURABILITY = SCHEMA_AND_DATA).

  • A tabela de histórico para tabela de versão do sistema com otimização de memória deve ser baseada em disco, quer tenha sido criada pelo usuário final ou pelo sistema.

  • As consultas que afetam apenas a tabela em memória atual podem ser usadas em módulos T-SQL compilados nativamente. Consultas temporais usando a cláusula FOR SYSTEM TIME não são suportadas em módulos compilados nativamente. A cláusula FOR SYSTEM TIME é suportada com tabelas com otimização de memória em consultas ad hoc e módulos não nativos.

  • Com SYSTEM_VERSIONING = ON, uma tabela de preparo com otimização de memória interna é criada automaticamente para aceitar as alterações de versão do sistema mais recentes, que são resultados de operações de atualização e exclusão em uma tabela atual otimizada para memória.

  • Os dados da tabela de preparação otimizada de memória interna são regularmente transferidos para a tabela de histórico baseada em disco por uma tarefa assíncrona de descarga de dados. Esse mecanismo de liberação de dados mantém os buffers de memória interna em menos de 10% do consumo de memória de seus objetos pai. Você pode monitorizar o consumo total de memória da tabela temporal versionada pelo sistema otimizada para memória consultando sys.dm_db_xtp_memory_consumerse resumindo os dados para a tabela de estágio interna otimizada para memória e a tabela temporal atual.

  • Você pode executar uma limpeza de dados manualmente ao correr sp_xtp_flush_temporal_history.

  • Com o SYSTEM_VERSIONING = OFF, ou quando o esquema de uma tabela versionada pelo sistema é modificado adicionando, removendo ou alterando colunas, todo o conteúdo do buffer interno de preparação é movido para a tabela de histórico baseada em disco.

  • A consulta de dados históricos está efetivamente sob o nível de isolamento de instantâneo e sempre retorna uma união entre o buffer de preparação em memória e a tabela em disco sem duplicatas.

  • ALTER TABLE operações que alteram o esquema da tabela internamente devem realizar um descarregamento de dados, o que pode prolongar a duração da operação.

A tabela de estágio otimizada para memória interna

O sistema cria uma tabela de preparação interna otimizada para memória para otimizar as operações DML.

  • O nome da tabela é gerado no seguinte formato: Memory_Optimized_History_Table_<object_id> onde <object_id> é o identificador da tabela temporal atual.

  • A tabela replica o esquema da tabela temporal atual mais uma coluna bigint. Esta coluna extra garante a unicidade das linhas movidas para o buffer de histórico interno.

  • A coluna extra tem o seguinte formato de nome: Change_ID[<suffix>], onde <suffix> é opcionalmente adicionado no caso de a tabela já ter uma coluna Change_ID.

  • O tamanho máximo da linha para uma tabela com versão do sistema e otimização de memória é reduzido em 8 bytes devido à coluna bigint extra na tabela de preparação. O novo máximo é agora de 8.052 bytes.

  • A tabela de preparo com otimização de memória interna não é representada no Pesquisador de Objetos do SQL Server Management Studio.

  • Os metadados sobre esta tabela e sua conexão com a tabela temporal atual podem ser encontrados em sys.internal_tables.

A tarefa de liberação de dados

A liberação de dados é uma tarefa ativada regularmente que verifica se qualquer tabela com otimização de memória atende a uma condição baseada no tamanho da memória para movimentação de dados. A movimentação de dados começa quando o consumo de memória da tabela de preparo interna atinge oito por cento do consumo de memória da tabela temporal atual.

A tarefa de liberação de dados é ativada regularmente com um cronograma que varia de acordo com a carga de trabalho existente. Com uma carga de trabalho pesada, a tarefa é executada a cada 5 segundos. Com uma carga de trabalho leve, a frequência sobe para cada minuto. Um thread é gerado para cada tabela de preparo interna otimizada para memória que precisa de limpeza.

O esvaziamento de dados exclui todos os registos do buffer interno em memória que são mais antigos do que a transação mais antiga atualmente em execução, de modo a mover esses registos para a tabela de histórico baseada em disco.

Você pode executar uma liberação de dados executando sp_xtp_flush_temporal_history e especificando o esquema e o nome da tabela:

EXEC sys.sp_xtp_flush_temporal_history <schema_name>, <object_name>;

O mesmo processo de movimentação de dados é invocado assim como quando o sistema executa a tarefa de esvaziamento de dados na sua agenda interna.