A documentação lista os seguintes requisitos para importações em massa com registro mínimo
- O modelo de recuperação do banco de dados é definido como simples ou registrado em massa.
- A tabela de destino é um heap vazio ou não vazio.
- A tabela de destino não é usada na replicação.
- A dica TABLOCK é especificada para a tabela de destino.
(ênfase minha).
Observe que nenhuma das opções acima menciona árvores B. Apesar disso, tanto minha experiência quanto o livro T-Sql Querying de Iztik Ben-Gann afirmam que TABLOCK
árvores B ed vazias receberão inserções em massa.
Existe uma garantia mais forte de registro mínimo ao executar INSERT INTO [...] WITH (TABLOCK)
em um heap do que em uma árvore B? Caso contrário, não consigo entender por que a documentação parece silenciosa sobre o comportamento da árvore B.
Veja se isso fornece mais contexto: https://learn.microsoft.com/en-us/sql/relational-databases/import-export/prerequisites-for-minimal-logging-in-bulk-import?view=sql- servidor-ver16
É possível que a documentação enfatize o comportamento dos heaps porque é mais provável que eles se beneficiem do registro mínimo no contexto de inserções em massa. Por outro lado, os índices clusterizados
(B-trees)
têm estruturas inerentemente mais complexas e podem exigir registros mais extensos, mesmo com arquivosTABLOCK
.O comportamento do log mínimo durante inserções em massa no SQL Server depende de vários fatores, incluindo a presença de um índice clusterizado e se a tabela está vazia ou não:
Heap (vazio ou não vazio): ao inserir em um heap vazio com
TABLOCK
, o SQL Server pode usar log mínimo, mesmo que o banco de dados não esteja no modelo de recuperaçãoBULK_LOGGED
ou .SIMPLE
Isso ocorre porque os dados estão sendo anexados ao final do arquivo e não exigem registros de log individuais para cada linha. Ao inserir em um heap não vazio comTABLOCK
, o registro mínimo também é usado. No entanto, pode haver algum registro adicional devido a divisões de páginas se os dados precisarem ser inseridos no meio do heap.Índice clusterizado (árvore B): se a tabela de destino tiver um índice clusterizado vazio, os dados e as páginas de índice serão minimamente registrados. Isso significa que apenas as páginas de alocação e os registros de log mínimos para as extensões utilizadas serão gerados, resultando em log reduzido. No entanto, se uma tabela tiver um índice clusterizado baseado em árvore B e não estiver vazia, as páginas de dados e as páginas de índice serão totalmente registradas, independentemente do modelo de recuperação. Isso ocorre porque a inserção em um índice clusterizado não vazio envolve a reorganização dos dados existentes para manter a ordem de classificação, o que requer registro adicional.
A documentação enfatiza que, com um índice clusterizado vazio, tanto os dados quanto as páginas de índice são minimamente registrados, fornecendo uma maneira eficiente de realizar inserções em massa com registro reduzido. Esse comportamento é específico da combinação de um índice clusterizado e uma tabela vazia.
Embora
TABLOCK
possa reduzir o registro em log para heaps e índices clusterizados, o comportamento é mais pronunciado para heaps, especialmente quando eles estão vazios. Para índices clusterizados, pode haver registro adicional devido à estrutura do índice.