Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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.
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áusulaFOR 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 colunaChange_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.
Conteúdo relacionado
- Tabelas temporais
- Introdução às tabelas temporais com versão do sistema
- Cenários de utilização da tabela temporal
- Verificações de consistência do sistema de tabela temporal
- Partição com tabelas temporais
- Considerações e limitações da tabela temporal
- Segurança das tabelas temporais
- Gerencie a retenção de dados históricos em tabelas temporais versionadas pelo sistema
- Exibições e funções de metadados de tabela temporal