Estou projetando um banco de dados cujos dados serão gerados diariamente por um ETL. Depois de algumas pesquisas, descobri que é possível usar a troca de partição ou a transferência de esquema para maximizar o tempo de atividade dos dados "ao vivo". Apenas para completar as informações, esse banco de dados será implantado no Banco de Dados SQL do Azure e desenvolvido no SQL Server 2019 Developer Edition no Docker. Consiste em ~ 20 tabelas, cada uma com menos de 10 milhões de linhas (esperado).
Então agora no meu design existem dois esquemas:
[App]
: contendo várias tabelas (sem chaves estrangeiras) com os dados ativos usados pelo aplicativo.[AppShadow]
: contendo exatamente as mesmas tabelas do[App]
esquema (mas com chaves estrangeiras), geralmente vazias, usadas como destino para o ETL.
Meu fluxo está assim:
- Execute o ETL usando as tabelas no
[AppShadow]
esquema como destino. As chaves estrangeiras garantem que meus dados sejam consistentes. set transaction isolation level serializable; begin transaction;
- Desabilite todas as restrições nas tabelas no
[AppShadow]
esquema usandoalter table [AppShadow].[<table_name>] nockeck constraint all;
- Truncar todas as tabelas no
[App]
esquema - Mude a partição de todas as tabelas de
[AppShadow]
para[App]
- Reative todas as restrições nas tabelas no
[AppShadow]
esquema usandoalter table [AppShadow].[<table_name>] with check check constraint all;
commit transaction;
Essas soluções parecem funcionar bem e o tempo de inatividade é mínimo, mas não consigo descobrir nenhuma vantagem ou desvantagem sobre a transferência de tabelas inteiras entre esquemas usando um [Swap]
esquema e a alter schema <schema_name> transfer <table_name>
instrução. Como o SQL Server é o SQL Server, tenho certeza de que existem algumas advertências ocultas que desconheço que devem me permitir preferir uma solução à outra.
Você tem algum conselho ou sugestão?
Todas as operações que você descreveu são apenas metadados, então eu não esperaria nenhuma diferença significativa no desempenho.
É estranho que você não tenha chaves estrangeiras em seu esquema [App]. Você já pagou o custo da verificação do DRI e, se validou as chaves estrangeiras em seu banco de dados, o Query Optimizer pode aproveitá-las.
A transferência de esquema permitiria que você deixasse todas as chaves estrangeiras no local.