Breaking

Post Top Ad

Your Ad Spot

domingo, 15 de diciembre de 2019

Cómo no realizar una actualización difícil en SQL Server / Azure

Hace mucho tiempo aprendí que la forma más rápida de hacer algo era no hacerlo en absoluto.
Un amigo mío me preguntó si podía revisar una declaración de actualización que estaba confundiendo a su grupo en busca de formas de optimizarlo.
La tabla tiene, apenas menos de 50 columnas, un número considerable de índices y la columna en cuestión, tiene un tipo de datos establecido en NVarChar (8), consta de algunos números, combinaciones de letras y números, etc.
El proceso tomaría 7 horas y media para ejecutar esta actualización, ya que analiza 100K filas a la vez. Hay un índice que incluye la columna CN1, pero ningún índice solo en la columna CN1. Así es como se ve la declaración de actualización:

ACTUALIZAR ARRIBA (@BatchSize) [dbo]. [Table_b4]
SET CN1 = (CASO
CUANDO TRY_CAST (CN1 COMO INT) ES NULO LUEGO CN1
OTRO FORMATO (CAST (CN1 COMO INT), 'val1')
FIN)
DONDE CN1 NO TIENE GUSTO ' [0-x] [0-x] [0-x] [0-x] [0-x] [0-x] [0-x] [0-x] '
Ahora, mientras revisamos esta declaración de actualización e intentamos optimizarla, se me ocurrió preguntar: "¿Por qué estoy actualizando esto?" Tenemos que emitir los datos de VarChar como un número entero, luego formatear los datos y verificar que ninguno de los valores existentes no es como la sección encantadora en la cláusula WHERE.
En Oracle 10g, tenía numerosas tablas SAS anchas que requerían una amplia CPU y E / S para actualizarlas. Introduje a los chicos a CTAS y luego intercambié la partición, pero también hay una versión de esto en SQL Server, llamada Swap Schema.
La idea detrás de esto es, en lugar de actualizar una tabla existente, crear una nueva tabla como seleccionar en la original, construir los datos en el inserto como lo haría para la actualización, luego intercambiar la nueva tabla con la original, omitiendo la actualización .
El nuevo proceso se vería así:
Dos esquemas:
  • DBO, (Propietario de la base de datos)
  • STAGING, (para la compilación y el cambio)
Primero, cree la tabla en el esquema STAGING, basándose en una selección de la tabla original en el esquema DBO, pero con los datos insertados como la actualización:
CREAR TABLA STAGING.LRG_Tbl
COMO SELECCIONAR * DE DBO.LRG_Tbl
DONDE TRY_CAST (CN1 COMO INT) ES NULO
ENTONCES FORMATO (CAST (CN1 AS INT), 'val1')
IR

INSERTAR EN LA ESCALADA.LRG_Tbl
SELECT * FROM DBO.LRG_Tbl donde CN1! = 'Val1 ′;
IR


Usted entiende la idea ... El objetivo aquí es realizar el CTAS con los datos preconstruidos en el formato actualizado y luego insertar el último de los datos.

Una vez que se construye la tabla, ahora tenemos que hacer el cambio y actualizar las estadísticas.

ALTERAR ESQUEMA TRANSFERENCIA DBO STAGING.LRG_Tbl
IR

CONCESIÓN SELECCIONE EN "DBO.LRG_Tbl" A "f_read_only"
IR

Otorgará todos los permisos al objeto para que coincida con el objeto anterior y el proceso se completará. Este es un proceso que deberá realizarse en un momento tranquilo, pero si el proceso que lleva solo unos minutos reemplaza un proceso actual que lleva más de 7 horas, puede valer la pena.

Si decide realizar un CTAS nombrando la tabla de manera diferente al original, necesitará usar el proceso SP_RENAME para corregir el nombre y esto podría ser un proceso más complicado. Con este proceso, los privilegios no se ven afectados.

Si selecciona de la tabla, ahora verá que tiene los datos actualizados sin tener que realizar una actualización.





 

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas