Skip to content

Qué es Accelerated Database Recovery en SQL Server 2019

¿Quién no tiene queries que se toman una eternindad en ejecutarse? Lo peor es cuando decides cancelar su ejecución y el famoso rollback se toma más del doble del tiempo que estaba ejecutándose. Este tipo de eventos ha inspirado esta espectacular característica: el Accelerated Database Recovery en SQL Server 2019.

Seguramente ya viste qué trae de nuevo SQL Server 2019, y uno de los títulos más novedosos es justamente este. Sin conocerlo suena a una recuperación impulsada con tiempos menores, ¿cierto? Veamos cómo funciona.


Las principales funciones de ADR

  • Recuperación de Base de Datos de manera rápida y consistente
  • Rollback de transacciones de manera instantánea
  • Log truncation «agresivo»

Un proyecto que fue soñado el año 2015 por Hanuma Kodavalla como «Constant Time Recovery« se hizo realidad con la ayuda de varios Ingenierios en Microsoft.

La promesa es que las transacciones de larga duración (long running transactions) no impacten el tiempo de recuperación intependientemente del número de transacciones o de su tamaño. Que los procesos de rollback puedan ser ejecutados inmediatamente y que el log de transacciones pueda ser truncado incluso mientras la transacción se ejecuta para así evitar su crecimiento indiscriminado.

Todo el concepto técnico sobre el uso de las fases de recuperación en Base de Datos respecto al Analysis, Redo y Undo se encuentra en la documentación oficial.


Accelerated Database Recovery

Siempre lo vemos mejor con un video.

De esta forma podemos ver una tremenda optimización de la recuperación de una base de datos ante una caída imprevista durante una carga masiva de datos. Si quieres ejecutarlo por tu cuenta puedes seguir el mismo flujo con esta guía.

--	Let's create two different databases

CREATE DATABASE WithNoADR
GO

CREATE DATABASE WithADR
ALTER DATABASE WithADR SET ACCELERATED_DATABASE_RECOVERY = ON
GO




--	Now we fill same tables in each of them

USE WithNoADR
GO

WAITFOR TIME '00:01:00'

SELECT b.*
INTO TableOld
FROM sys.all_columns AS a 
CROSS JOIN sys.all_objects AS b;


--	Open a different Window

USE WithADR
GO

WAITFOR TIME '00:00:00'

SELECT b.*
INTO TableNew
FROM sys.all_columns AS a 
CROSS JOIN sys.all_objects AS b;

Ahora bien, qué pasaría durante un proceso de rollback en el servidor.

Seguro que en algún momento de tu vida cancelaste una consulta de larga duración. Puede ser a través de una ejecución de KILL, pero esto implica hacer un trabajo de ROLLBACK. Veremos en este ejemplo cómo mejoramos estos tiempos de recuperación.

¡Espectacular!

¿Viste la diferencia de tiempos al ejecutar el Rollback?

Estas son grandes mejoras

Aquí el flujo

USE WithNoADR
GO

BEGIN TRAN
SELECT b.*
INTO TableOld
FROM sys.all_columns AS a 
CROSS JOIN sys.all_objects AS b;

--ROLLBACK

--	Open a different Window

USE WithADR
GO

BEGIN TRAN
SELECT b.*
INTO TableNew
FROM sys.all_columns AS a 
CROSS JOIN sys.all_objects AS b;

--ROLLBACK

www.datoptim.com
I love working on SQL Server Performance Tuning and finding the origin of the problems. Music and SQL Server passionate.

Carrito
Volver arriba