Tenemos un procedimiento almacenado en nuestra base de datos que actualiza una tabla uniendo 2 tablas en 30 columnas con una condición where. El SQL está en el formato general de:Muchas columnas UPDATE-JOIN con many-ISNULL lleva mucho tiempo?
UPDATE Target
SET col1 = Source.col1
INNER JOIN Source
on
ISNULL(Target.Col2, '') = ISNULL(Source.Col2, '') and
ISNULL(Target.Col3, '') = ISNULL(Source.Col3, '') and
.
.
.
ISNULL(Target.Col31, '') = ISNULL(Source.Col31, '') and
este es el plan de consulta. Guárdalo en tu PC y vuelve a abrirlo para que se escale mejor.
la tabla de origen tiene registros 65M, el 165M de destino. Anteriormente solía ejecutarse en unos pocos minutos. Considerando lo fea y potencialmente ineficiente que es la consulta, me parece sorprendente. Este mes funcionó durante 1,5 horas, usó el 100% del procesador y tuvimos que matarlo.
¿Alguna sugerencia de cómo improvisar la siguiente consulta y hacer que se ejecute a tiempo ...?
Tenemos índices de una sola columna en algunas de las columnas utilizadas en la condición de unión de 30 col.
Conozco la función ISNULL y la unión en 30 columnas es una locura y este es un mal diseño. No me culpes, heredé esta economía.
Lamentablemente, no hay tiempo para un rediseño. ¿Alguna sugerencia?
¿Qué ha cambiado desde el último mes? –
Actualice todos los valores NULL a '''', luego ejecute la consulta sin los ISNULL. Pero la pregunta de Remus es muy pertinente, ¿qué * ha * cambiado en ese período? – MatBailie
¿Ha considerado volver a escribirlo como una combinación? ¿Ha considerado hacer que esas columnas no sean nulables para eliminar 60 llamadas ISNULL? –