sql >> Base de Datos >  >> RDS >> Database

Más operaciones en línea disponibles ahora o pronto

Estaba ejecutando algunas pruebas en SQL Database y descubrí al menos una nueva operación que admite ONLINE = ON . Por cierto, esta es una versión muy reciente:SELECT @@VERSION; continúa dando un número de compilación antiguo, pero la prueba está en la fecha de compilación:

Microsoft SQL Azure (RTM) – 12.0.2000.8
12 de febrero de 2015 00:53:13
Copyright (c) Microsoft Corporation

Esta versión de Azure SQL Database admite ONLINE = ON opción para ALTER TABLE ... ALTER COLUMN .

Supongamos que tiene una tabla con una columna anulable:

CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255));
 
INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;

Y ahora decide hacer que esa columna no admita valores NULL, puede hacer esto (asumiendo que no hay NULL s):

ALTER TABLE dbo.a
  ALTER COLUMN x VARCHAR(255) NOT NULL
  WITH (ONLINE = ON);

También puede hacer cosas como cambiar la intercalación, el tipo de datos o el tamaño de la columna:

ALTER TABLE dbo.a 
ALTER COLUMN x NVARCHAR(510)    -- changed data type and length
  COLLATE Albanian_BIN NOT NULL -- changed collation and nullability
  WITH (ONLINE = ON);

En las versiones actuales de SQL Server (y versiones anteriores de Azure SQL Database), ONLINE = ON la sugerencia no era compatible con ALTER TABLE , y sin la opción, se trataba de una operación de bloqueo y tamaño de datos. Para ser justos, la primera vez que ejecuté el código, solo pude probar que la versión con ONLINE = ON se ejecutó con éxito, no es que funcionara como se anuncia.

Ejecuté este código con ONLINE = ON y sin:

CREATE TABLE dbo.a(id INT PRIMARY KEY, x VARCHAR(255));
 
INSERT dbo.a(id, x) SELECT TOP (1) [object_id], name FROM sys.all_objects;
 
-- placeholder;
 
ALTER TABLE dbo.a 
  ALTER COLUMN x NVARCHAR(510)
  COLLATE Albanian_BIN NOT NULL 
  -- WITH (ONLINE = ON);
 
-- placeholder;
 
DROP TABLE dbo.a;

En el --placeholder lugar, probé algunas cosas para determinar cualquier diferencia en el comportamiento (esta era nuestra base de datos SQL de producción, por lo que no quería usar suficientes datos o crear suficiente actividad para que la diferencia fuera obvia). Quería verificar en ambos escenarios si la página había cambiado (lo que indica una verdadera operación en línea) o si los valores se actualizaron en las páginas existentes (una operación no tan en línea). También podría haber ampliado la prueba para ver cuántas páginas nuevas se crearon si las páginas estaban llenas y/o se usaron los 255 caracteres, pero pensé que solo ver si las páginas cambiaban sería suficiente.

Probé DBCC IND() :

DBCC IND(N'dbname', N'dbo.a', 1, 1);

Los resultados aquí no fueron sorprendentes:

Mensaje 40518, Nivel 16, Estado 1
El comando DBCC 'IND' no es compatible con esta versión de SQL Server.

Y sys.dm_db_database_page_allocations (el reemplazo de DBCC IND ):

SELECT allocated_page_page_id
  FROM sys.dm_db_database_page_allocations(DB_ID(),OBJECT_ID(N'dbo.a'),1,1,N'LIMITED')
  WHERE is_iam_page = 0;

Esto arrojó un conjunto de resultados vacío. Creo que es por diseño que esta función de administración dinámica no expone ninguna información física en Azure SQL Database.

A continuación, probé un truco con fn_PhysLocCracker , sobre el que personas como Michelle Ufford (@sqlfool) han escrito antes:

SELECT l.page_id FROM dbo.a
  OUTER APPLY sys.fn_PhysLocCracker(%%PhysLoc%%) AS l;

¡Éxito! Esto devolvió valores para las páginas utilizadas en el escaneo contra dbo.a , y es claro que en el ONLINE = ON versión, los datos se mueven a páginas nuevas (presumiblemente dejando las antiguas disponibles durante la operación) y, sin la pista, los datos y metadatos se actualizan en su lugar:

Comparación de páginas bajo el comportamiento estándar ALTER COLUMN (izquierda) con ONLINE =ON (derecha)

Otra cosa que quería comparar eran los planes de ejecución. Puede que no vea mucho en Management Studio, pero en SQL Sentry Plan Explorer Pro, puedo ver la pila de llamadas completa, incluido lo que sucede detrás de escena de algunos comandos DDL. Nuestra herramienta no decepcionó:si bien no presentó un plan real para la variación de actualización en el lugar, también demuestra que existe una diferencia de comportamiento significativa cuando se usa ONLINE = ON :

Comparación de planes bajo el comportamiento estándar ALTER COLUMN (izquierda) con ONLINE =ON (derecha)

Por supuesto, solo verá esta diferencia si cumple con todas las demás condiciones requeridas para las operaciones en línea (muchas son similares a los requisitos para la reconstrucción de índices en línea) en la documentación actualizada recientemente.

Ahora, si no está utilizando SQL Database, ¿cómo le ayuda eso? Después de todo, esta sintaxis no se analiza correctamente ni siquiera en la Actualización acumulativa n.º 6 de SQL Server 2014 (12.0.2480). Bueno, Microsoft no ha estado guardando exactamente el hecho de que el patrón de desarrollo se ha convertido en "nube primero, luego caja", como insinuó Mark Souza recientemente cuando tuiteó sobre la nueva característica de seguridad de nivel de fila introducida primero en Azure SQL Database:

Esto significa que es probable que estas operaciones en línea también lleguen pronto a su copia local de SQL Server. Sin embargo, al igual que muchas otras operaciones en línea, tenga en cuenta que estas cosas tienden a reservarse para Enterprise Edition.