Gostaria de excluir cerca de 100.000 registros com sobrecarga mínima do servidor. Eu tive algumas perguntas incômodas que não pude testar corretamente, então decidi perguntar a alguns especialistas aqui. Qual seria melhor:
1-
BEGIN TRAN
DELETE FROM dbo.x
WHERE ID IN (
1
,2
,3
,4
...
,100000
)
COMMIT
2-
BEGIN TRAN
DELETE FROM dbo.x
WHERE ID = 1
GO
DELETE FROM dbo.x
WHERE ID = 2
GO
...
COMMIT
3-
DELETE FROM dbo.x
WHERE ID = 1
GO
DELETE FROM dbo.x
WHERE ID = 2
GO
...
Minha suposição é que o nº 1 causaria uma varredura com base na % de amostra, escolheria os itens, removeria-os e registraria como uma série de transações. Talvez baseasse as informações no log de transações sobre quais páginas foram alteradas em vez de cada indvl. transação, portanto, você só pode reverter toda a atividade e remarcar as páginas, ou você pode confirmar. Isso está correto?
Em # 2, estou pensando se a instrução GO causa muito mais atividade de log de transações, não permitindo que o SQL Server Storage Engine role tudo isso em uma transação grande, mas ainda fornece alguma otimização para o log de transações com o BEGIN TRAN - Blocos COMMIT, tornando-o mais eficaz que o #3, mas menos eficaz que o #1.
Eu então assumiria que o nº 3 seria o pior, pois cada indvl. transação é registrada.
Se alguém tiver boas postagens de blog ou cenários de teste que possam me indicar, isso também seria ótimo. Procurei maneiras de me aprofundar no log de transações para descobrir sozinho, mas, neste ponto, pensei em perguntar a vocês.
Obrigado!
Do ponto de vista de registro, 1 e 2 serão aproximadamente iguais, pois em ambos os casos você está fazendo todas as exclusões em uma única transação. Haverá muitos bloqueios e provavelmente bloqueios enquanto a exclusão está sendo executada. O nº 3 é uma única transação por lote, portanto, os usuários não serão muito afetados e você terá muitas transações pequenas no log de transações em vez de uma grande. # 2 e # 3 devem levar aproximadamente o mesmo tempo para serem executados. O nº 1 deve levar menos tempo que o nº 2 e o nº 3 porque é apenas um comando, mas o tempo de execução provavelmente ainda causará problemas.
Eu provavelmente gostaria de fazer algo assim. Isso minimizará o bloqueio e o bloqueio que precisam acontecer, lidando apenas com 1.000 linhas por vez.