Query de 40 horas?

14/10/2005 - 17:32 por rigoberto | Informe spam
buenos dias:

Mi problema es el siguiente: Tengo una tabla TABLA_BASE de
aproximadamente 42 millones de registros con una clave unica y otra
tabla TABLAAUX con aproximadamente 21 millones de registros con datos
que tengo que actualizar en la primera tabla.

En la primera tabla utilizo el siguiente query para crear los campos.

BEGIN TRAN
ALTER TABLE [TABLA_BASE] ADD [CAMPO_FLAG] [smallint] DEFAULT (0) NOT
NULL
ALTER TABLE [TABLA_BASE] ADD [RGS_FLAG] [smallint] DEFAULT (0) NOT
NULL
ALTER TABLE [TABLA_BASE] ADD [OTRO_FLAG] [smallint] DEFAULT (0) NOT
NULL
ALTER TABLE [TABLA_BASE] ADD [ESTADO] [smallint] DEFAULT (0) NOT NULL

ALTER TABLE [TABLA_BASE] ADD [FECHA] [datetime] DEFAULT ('2002-01-12
00:00:00.000') NOT NULL
ALTER TABLE [TABLA_BASE] ADD [CONTADOR] [smallint] DEFAULT (0) NOT
NULL
COMMIT
GO
Cuando ejecuto el query en pruebas, se demora aproximadamente 40 Horas.
como este procedimiento se ejecutara solo UNA VEZ en produccion, se
puede manejar. pero el inconveniente es en los procesos mensuales en
los cuales actualizo estos campos. El query a utilizar sera este:

BEGIN TRAN
UPDATE TABLA_BASE
SET FECHA = '2005-02-01 00:00:00.000',
CONTADOR = CONTADOR + 1,
CAMPO_FLAG = CASE WHEN P.CAMPO_FLAG < C.VALOR THEN C.VALOR ELSE
P.CAMPO_FLAG END
FROM TABLA_BASE P INNER JOIN TABLAAUX C ON (C.CLAVE = P.CLAVE)
COMMIT
GO

El query anterior en pruebas lleva 60 horas y no ha terminado. Ekl
tiempo maximo permitido en produccion para este procedimiento seria de
20 horas. ya he probado enviandolo desde un procedimiento almacenado
pero el tiempo se reduce muy poco.

Pregunta: esto es normal por la cantidad de registros ha actualizar (21
millones) ó es un problemas al crear los campos con valores por
defecto?.

El problema es que con estos tiempos cada prueba completa se me demora
casi una semana

gracias por cualquier ayuda a disminuir estos tiempos.
 

Leer las respuestas

#1 Franklin Marcano
14/10/2005 - 17:47 | Informe spam
humm, se me ocurre como prueba que realizes una funcion, para que te
devuelva el valor a actualizar, de esa forma solo en ciertos casos hara la
funcion, y no tendrias que armar la consulta, en memoria.

la funcion recibiria como parametro p.clave, y harias un select clave from
tablaaux where clave=p.clave
y devolverias el valor actualizar

la consulta quedaria de la siguiente forma:
UPDATE TABLA_BASE
SET FECHA = '2005-02-01 00:00:00.000',
CONTADOR = CONTADOR + 1,
CAMPO_FLAG = CASE WHEN P.CAMPO_FLAG < C.VALOR THEN funcion(p.clave)
ELSE
P.CAMPO_FLAG END
FROM TABLA_BASE P


"rigoberto" escribió en el mensaje
news:
buenos dias:

Mi problema es el siguiente: Tengo una tabla TABLA_BASE de
aproximadamente 42 millones de registros con una clave unica y otra
tabla TABLAAUX con aproximadamente 21 millones de registros con datos
que tengo que actualizar en la primera tabla.

En la primera tabla utilizo el siguiente query para crear los campos.

BEGIN TRAN
ALTER TABLE [TABLA_BASE] ADD [CAMPO_FLAG] [smallint] DEFAULT (0) NOT
NULL
ALTER TABLE [TABLA_BASE] ADD [RGS_FLAG] [smallint] DEFAULT (0) NOT
NULL
ALTER TABLE [TABLA_BASE] ADD [OTRO_FLAG] [smallint] DEFAULT (0) NOT
NULL
ALTER TABLE [TABLA_BASE] ADD [ESTADO] [smallint] DEFAULT (0) NOT NULL

ALTER TABLE [TABLA_BASE] ADD [FECHA] [datetime] DEFAULT ('2002-01-12
00:00:00.000') NOT NULL
ALTER TABLE [TABLA_BASE] ADD [CONTADOR] [smallint] DEFAULT (0) NOT
NULL
COMMIT
GO
Cuando ejecuto el query en pruebas, se demora aproximadamente 40 Horas.
como este procedimiento se ejecutara solo UNA VEZ en produccion, se
puede manejar. pero el inconveniente es en los procesos mensuales en
los cuales actualizo estos campos. El query a utilizar sera este:

BEGIN TRAN
UPDATE TABLA_BASE
SET FECHA = '2005-02-01 00:00:00.000',
CONTADOR = CONTADOR + 1,
CAMPO_FLAG = CASE WHEN P.CAMPO_FLAG < C.VALOR THEN C.VALOR ELSE
P.CAMPO_FLAG END
FROM TABLA_BASE P INNER JOIN TABLAAUX C ON (C.CLAVE = P.CLAVE)
COMMIT
GO

El query anterior en pruebas lleva 60 horas y no ha terminado. Ekl
tiempo maximo permitido en produccion para este procedimiento seria de
20 horas. ya he probado enviandolo desde un procedimiento almacenado
pero el tiempo se reduce muy poco.

Pregunta: esto es normal por la cantidad de registros ha actualizar (21
millones) ó es un problemas al crear los campos con valores por
defecto?.

El problema es que con estos tiempos cada prueba completa se me demora
casi una semana

gracias por cualquier ayuda a disminuir estos tiempos.

Preguntas similares