Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Problema con un Procedimiento Almacenado

Estas en el tema de Problema con un Procedimiento Almacenado en el foro de SQL Server en Foros del Web. Este trabaja con un servidor vinculado al sybase. en mi ambiente de pruebas funciona ok.. y realiza la actualización correctamente obteniendo los datos desde el ...
  #1 (permalink)  
Antiguo 31/08/2009, 15:04
 
Fecha de Ingreso: enero-2005
Mensajes: 5
Antigüedad: 19 años, 3 meses
Puntos: 0
Mensaje Problema con un Procedimiento Almacenado

Este trabaja con un servidor vinculado al sybase. en mi ambiente de pruebas funciona ok.. y realiza la actualización correctamente obteniendo los datos desde el sybase(linked server) hacia el sql server.

El problema lo tengo en el ambiente de producción puesto que la tabla CO_HISTORICO cuenta con más de 12 millones de registros y la tabla CO_DATA cuenta con 21 mil registros. y la misma consulta que utilizo en mi store lo hago en el sql advantage del sybase es rápida, le consulté al dba y me dice que cuenta con índices... pero cuando hago en el analizador de consultas o ejecutando en store en el sql server 2008 se demora demasiado...
Empezando desde la creación del store y la ejecución. Toma demasiado tiempo.

Adjunto query

CREATE PROCEDURE [dbo].[p_seleccion]
(@is_batch_ec varchar(4),
@ladt_fecha1 datetime,
@ladt_fecha2 datetime)

as

begin
Insert Into lim_p452 ( v_cta, v_bcoref, c_moneda, c_dbcr, m_monto, d_fecdep, d_fecvalor, c_codtrn )
Select SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 ),
tj.REFE_NUMBER,
tj.CURRC,
tj.DEBIT_CREDIT,
( Case tj.CURRC When '000' Then tj.LCY_AMOUNT Else tj.FCY_AMOUNT End ),
tj.DATE_CREAC,
tj.VALUE_DATE,
tj.TRANSACTION_CODE
From Server08.INXGEN.dbo.CO_DATA tj
Where tj.VEHIC = '001'
And tj.BRACH = '000'
And tj.BATCH = @is_batch_ec
And tj.DATE_CREAC BetWeen @ladt_fecha1 And @ladt_fecha2
And RTrim ( LTrim ( tj.ACCOUNT ) ) <> 'DELETED'
And Not Exists ( Select * From lim_p452 with (nolock)
Where v_cta = SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 )
And v_bcoref = tj.REFERENCE_NUMBER
And c_moneda = tj.CURRC
And c_dbcr = tj.DEBIT_CREDIT
And d_fecdepic BetWeen @ladt_fecha1 And @ladt_fecha2 )
Union
Select SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 ),
tj.REFERENCE_NUMBER,
tj.CURRC,
tj.DEBIT_CREDIT,
( Case tj.CURRC When '000' Then tj.LCY_AMOUNT Else tj.FCY_AMOUNT End ),
tj.DATE_CREAC,
tj.VALUE_DATE,
tj.TRANSACTION_CODE
From Server08.INXGEN.dbo.CO_HISTORICO tj
Where tj.VEHICULO = '001'
And tj.BRANCH = '000'
And tj.BATCH = @is_batch_ec
And tj.DATE_CREAC BetWeen @ladt_fecha1 And @ladt_fecha2
And RTrim ( LTrim ( tj.ACCOUNT ) ) <> 'DELETED'
And Not Exists ( Select * From lim_p452 with (nolock)
Where v_cta = SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 )
And v_bcoref = tj.REFERENCE_NUMBER
And c_moneda = tj.CURRC
And c_dbcr = tj.DEBIT_CREDIT
And d_fecdep BetWeen @ladt_fecha1 And @ladt_fecha2 )

End

Gracias.

Última edición por AlmaBlue; 31/08/2009 a las 15:08 Razón: query
  #2 (permalink)  
Antiguo 31/08/2009, 20:09
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Problema con un Procedimiento Almacenado

Las concatenaciones de campos caracter, asi como las funciones aplicadas a los campos de la bd hacen las consultas mas lentas...

tal vez te serviria realizar una tabla temporal con los datos filtrados en tu server y con esa info ir a la tabla en el servidor linkeado, para ir solo una vez y se aproveche la velocidad de los indices utilizando joins adecuados...

tambien al consultar las fechas puedes cambiar el between por >= y <= ...

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 01/09/2009, 10:08
 
Fecha de Ingreso: septiembre-2008
Mensajes: 12
Antigüedad: 15 años, 8 meses
Puntos: 1
Respuesta: Problema con un Procedimiento Almacenado

Tu where es muy complejo, tienes que traer la información a un temporal utilizando un where pequeño. Yo utilizaría el de fechas. Luego sobre el teporal aplicas el where completo.



Cita:
Iniciado por AlmaBlue Ver Mensaje
Este trabaja con un servidor vinculado al sybase. en mi ambiente de pruebas funciona ok.. y realiza la actualización correctamente obteniendo los datos desde el sybase(linked server) hacia el sql server.

El problema lo tengo en el ambiente de producción puesto que la tabla CO_HISTORICO cuenta con más de 12 millones de registros y la tabla CO_DATA cuenta con 21 mil registros. y la misma consulta que utilizo en mi store lo hago en el sql advantage del sybase es rápida, le consulté al dba y me dice que cuenta con índices... pero cuando hago en el analizador de consultas o ejecutando en store en el sql server 2008 se demora demasiado...
Empezando desde la creación del store y la ejecución. Toma demasiado tiempo.

Adjunto query

CREATE PROCEDURE [dbo].[p_seleccion]
(@is_batch_ec varchar(4),
@ladt_fecha1 datetime,
@ladt_fecha2 datetime)

as

begin
Insert Into lim_p452 ( v_cta, v_bcoref, c_moneda, c_dbcr, m_monto, d_fecdep, d_fecvalor, c_codtrn )
Select SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 ),
tj.REFE_NUMBER,
tj.CURRC,
tj.DEBIT_CREDIT,
( Case tj.CURRC When '000' Then tj.LCY_AMOUNT Else tj.FCY_AMOUNT End ),
tj.DATE_CREAC,
tj.VALUE_DATE,
tj.TRANSACTION_CODE
From Server08.INXGEN.dbo.CO_DATA tj
Where tj.VEHIC = '001'
And tj.BRACH = '000'
And tj.BATCH = @is_batch_ec
And tj.DATE_CREAC BetWeen @ladt_fecha1 And @ladt_fecha2
And RTrim ( LTrim ( tj.ACCOUNT ) ) <> 'DELETED'
And Not Exists ( Select * From lim_p452 with (nolock)
Where v_cta = SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 )
And v_bcoref = tj.REFERENCE_NUMBER
And c_moneda = tj.CURRC
And c_dbcr = tj.DEBIT_CREDIT
And d_fecdepic BetWeen @ladt_fecha1 And @ladt_fecha2 )
Union
Select SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 ),
tj.REFERENCE_NUMBER,
tj.CURRC,
tj.DEBIT_CREDIT,
( Case tj.CURRC When '000' Then tj.LCY_AMOUNT Else tj.FCY_AMOUNT End ),
tj.DATE_CREAC,
tj.VALUE_DATE,
tj.TRANSACTION_CODE
From Server08.INXGEN.dbo.CO_HISTORICO tj
Where tj.VEHICULO = '001'
And tj.BRANCH = '000'
And tj.BATCH = @is_batch_ec
And tj.DATE_CREAC BetWeen @ladt_fecha1 And @ladt_fecha2
And RTrim ( LTrim ( tj.ACCOUNT ) ) <> 'DELETED'
And Not Exists ( Select * From lim_p452 with (nolock)
Where v_cta = SubString ( tj.ACCOUNT, 2, 6 ) + Left ( tj.ACCOUNT, 1 ) + Right ( tj.ACCOUNT, 3 )
And v_bcoref = tj.REFERENCE_NUMBER
And c_moneda = tj.CURRC
And c_dbcr = tj.DEBIT_CREDIT
And d_fecdep BetWeen @ladt_fecha1 And @ladt_fecha2 )

End

Gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:40.