Diferencia del nivel de transacción entre usar un filtro grande frente a "Comienza Tran/Compromiso"

dba.stackexchange https://dba.stackexchange.com/questions/29461

Pregunta

Me gustaría eliminar unos 100,000 registros con una sobrecarga mínima del servidor. He tenido algunas preguntas persistentes que no he podido probar correctamente, así que pensé que preguntaría a algunos expertos aquí. Lo que sería mejor:

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
...

Mi suposición es que el n. ° 1 causaría un escaneo basado en el %de muestra, elegir los elementos, eliminarlos y registrarlo como una serie de transacciones. Tal vez basaría la información en el registro de transacciones en cuanto a qué páginas se cambiaron en lugar de cada INDVL. Transacción, por lo tanto, solo puede revertir toda la actividad y comentar las páginas, o puede comprometerse. ¿Es eso correcto?

En el n. ° 2, creo que la declaración GO causa mucha más actividad de registro de transacciones al no permitir que el motor de almacenamiento de SQL Server enrolle todo en 1 transacción grande, pero aún así proporciona cierta optimización para el registro de transacciones con el comienzo Tran - Comprometer bloques, lo que lo hace más efectivo que el #3 pero menos efectivo que el #1.

Entonces asumiría que el #3 sería el peor como cada INDVL. La transacción está registrada.

Si alguien tiene buenas publicaciones de blog o escenarios de prueba, podría señalarme, eso también sería genial. He buscado formas de cavar profundamente en el registro de transacciones para resolverlo, pero en este punto, pensé que les preguntaría.

¡Gracias!

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top