|
|
|
| |||||||||
![]() |
|
|
«
Previous Thread
|
Next Thread
»
|
Thread Tools | Search this Thread | Display Modes |
|
#1
|
|||
|
|||
|
Optimizar stored procedure
Buenas Tardes:
Alguien me podria decir como puedo hacer este stored procedure mas rapido?? estoy usando SYBASE y tarda 00:13:47 en ejecutarse, necesito que tarde menos de 6 minutos en ejecutarse. alguien pueda ayudarme. Gracias. CREATE PRCEDURE PR_PP_UB_USRDETBYSIDNID @dINIT_DATE datetime=NULL, @dEND_DATE datetime=NULL AS DECLARE @dINIT_DATE_AUX DATETIME, @dEND_DATE_AUX DATETIME, @dINIT_DATE_CPY DATETIME, @dEND_DATE_CPY DATETIME, @dINIT_DATE_AUX_CPY DATETIME, @dEND_DATE_AUX_CPY DATETIME, @iCNTADR INT, @CUR_SID VARCHAR(15), @CUR_NID VARCHAR(15), @iTTAL INT, @iTTAL_BAZ INT, @iTTAL_EKT INT, @iTTAL_IUS INT, @USRS_BAZ INT, @USRS_EKT INT, @USRS_IUS INT, @USRS_TT INT, @iTTAL_BAD INT, @INIT_PRC DATETIME, @END_PRC DATETIME, @ID_BEGIN INT, @ID_END INT, @CTL_ID_BEGIN INT, @CTL_DATE_ID_BEGIN DATETIME, @CTL_ID_END INT, @CTL_DATE_ID_END DATETIME SET N**** N SELECT @INIT_PRC = (SELECT GETDATE()) -- VALID LA INTEGRIDAD DE LS PARAMETRS IF(@dINIT_DATE IS NULL AND @dEND_DATE IS NT NULL) R (@dINIT_DATE IS NT NULL AND @dEND_DATE IS NULL) BEGIN SELECT 'ERRR'=-1,'ERRR_DESC'= 'SL EXISTEN 2 PSIBILIDADES DE EJECUTAR ESTE SP. 1) ENVIE FECHA INICIAL Y FECHA FINAL 2) N ENVIE NADA EL SP CNSULTARA A LA TABLA DE CNTRL' RETURN -1 END CREATE TABLE #TMP_UB_USRDETBYSIDNID2 ( ID_CSV int NT NULL, PMM_DATETIME datetime NT NULL, SID varchar(15) NULL, NID varchar(15) NULL, MINid varchar(15) NT NULL ) CREATE INDEX IX_#TMP_UB_USRDETBYSIDNID2 N #TMP_UB_USRDETBYSIDNID2(PMM_DATETIME, SID, NID) IF(@dINIT_DATE IS NULL) BEGIN -- CHEC EL DATE_ID_END DE LA TABLA DE CNTRL PARA SABER HASTA QUE FECHA ME QUEDE SELECT @dINIT_DATE = (SELECT DATE_ID_END FRM CTL_TABLES WHERE TABLE_NAME='UB_USRDETBYSIDNID') IF (@dINIT_DATE IS NULL) BEGIN -- SIGNIFICA QUE PR ALGUNA RAZN LA TABLA DE CNTRL N SABE EN QUE FECHA NS QUEDAMS -- PR L TANT, VY A LA TABLA DESTIN Y REVIS LA ULTIMA FECHA CAPTURADA SELECT @dINIT_DATE = (SELECT MAX(PMM_DATETIME) FRM UB_USRDETBYSIDNID) IF(@dINIT_DATE IS NULL) BEGIN -- SIGNIFICA QUE N HAY INFRMACIN CNFIABLE EN LA TABLA DESTIN SELECT 'ERRR'=-1,'ERRR_DESC'= 'AL CNSULTAR LA TABLA UB_USRDETBYSIDNID2 N FUE PSIBLE ESTABLECER LA FECHA INICIAL DE BUSQUEDA PARA ESTA PERACIN' RETURN -1 END END -- DE AQUI REST 2 HRAS PARA ASEGURAR BTENER LA INFRMACIN MAS RECIENTE SELECT @dINIT_DATE = (SELECT DATEADD(hour,-2,@dINIT_DATE)) SELECT @dINIT_DATE=CNVERT(VARCHAR(2), DATEPART(mm, @dINIT_DATE)) + "/" + CNVERT(VARCHAR(2), DATEPART(dd, @dINIT_DATE)) + "/" + CNVERT(VARCHAR(4), DATEPART(yy, @dINIT_DATE)) + " " + CNVERT(VARCHAR(2), DATEPART(hh, @dINIT_DATE)) + ": 00:00" SELECT @dEND_DATE = (SELECT GETDATE()) END ELSE BEGIN -- SIGNIFICA QUE EL USUARI HA ELEGID EL PERID DE TIEMP EN EL CUAL BUSCARA INFRMACIN EN LA TABLA CSV. -- VALID QUE LA FECHA INICIAL SEA MENR IGUAL A LA FECHA FINAL. IF(@dINIT_DATE @dEND_DATE) BEGIN SELECT 'ERRR'=-1,'ERRR_DESC'= 'LA FECHA INICIAL ES MAYR A LA FINAL, FECHAL INICIAL: ' + CNVERT(VARCHAR(19),CNVERT(VARCHAR(10), @dINIT_DATE,102) + ' ' + CNVERT(VARCHAR(8), @dINIT_DATE,108)) + ' FECHA FINAL: ' + CNVERT(VARCHAR(19),CNVERT(VARCHAR(10), @dEND_DATE,102) + ' ' + CNVERT(VARCHAR(8), @dEND_DATE,108)) RETURN -1 END END INSERT INT #TMP_UB_USRDETBYSIDNID2 SELECT ID_CSV, PMM_DATETIME, SID, NID, MINid FRM CSV WHERE PMM_DATETIME BETWEEN @dINIT_DATE AND @dEND_DATE RDER BY PMM_DATETIME IF @@RW**** = 0 BEGIN SELECT 'ERRR'=-1,'ERRR_DESC'= 'N HAY INFRMACIN DISPNIBLE EN EL PERID: ' + CNVERT(VARCHAR(19),CNVERT(VARCHAR(10), @dINIT_DATE,102) + ' ' + CNVERT(VARCHAR(8), @dINIT_DATE,108)) + ' AL ' + CNVERT(VARCHAR(19),CNVERT(VARCHAR(10), @dEND_DATE,102) + ' ' + CNVERT(VARCHAR(8), @dEND_DATE,108)) RETURN -1 END -- DEB HACER LA BUSQUEDA DEL @ID_BEGIN MAS PEQUE DENTR DEL INTERVAL SELECT @ID_BEGIN = (SELECT MIN(ID_CSV) FRM #TMP_UB_USRDETBYSIDNID2) -- YA TENG EL @ID_BEGIN, DEB ENCNTRAR EL @ID_END SELECT @ID_END = (SELECT MAX(ID_CSV) FRM #TMP_UB_USRDETBYSIDNID2) -- AHRA ENCUENTR LA FECHA INICIAL Y LA FINAL SELECT @dINIT_DATE = (SELECT MIN(PMM_DATETIME) FRM #TMP_UB_USRDETBYSIDNID2) SELECT @dEND_DATE = (SELECT MAX(PMM_DATETIME) FRM #TMP_UB_USRDETBYSIDNID2) -- RESPALD LAS VARIABLES PARA QUE PSTERIRMENTE ACTUALIZE LA TABLA DE CNTRL SELECT @CTL_ID_BEGIN = @ID_BEGIN SELECT @CTL_DATE_ID_BEGIN = @dINIT_DATE SELECT @CTL_ID_END = @ID_END SELECT @CTL_DATE_ID_END = @dEND_DATE -- SE DEBE AJUSTAR EL @dINIT_DATE A LA HRA QUE PERTENEZCA. SELECT @dINIT_DATE_AUX = (SELECT CNVERT(DATETIME, (CNVERT(VARCHAR(10),@dINIT_DATE,102) + ' 00:00:00'))) SELECT @dEND_DATE_AUX = (SELECT CNVERT(DATETIME, (CNVERT(VARCHAR(10),@dINIT_DATE,102) + ' 00:04:59'))) WHILE (@dINIT_DATE_AUX <= @dEND_DATE_AUX) BEGIN IF ((@dINIT_DATE >= @dINIT_DATE_AUX) AND (@dINIT_DATE <= @dEND_DATE_AUX)) BEGIN SELECT @dINIT_DATE = @dINIT_DATE_AUX SELECT @dINIT_DATE_AUX = NULL BREAK END ELSE BEGIN SELECT @dINIT_DATE_AUX = (SELECT DATEADD(ss, 300,@dINIT_DATE_AUX)) SELECT @dEND_DATE_AUX = (SELECT DATEADD(ss, 299,@dINIT_DATE_AUX)) END END -- AJUST EL PRIMER INTERVAL DE BUSQUEDA SELECT @dEND_DATE_AUX = (SELECT DATEADD(ss,299,@dINIT_DATE)) SELECT @iCNTADR = 0 CREATE TABLE #TMP2_UB_USRDETBYSIDNID2 ( ID_CSV int NT NULL, PMM_DATETIME datetime NULL, SID varchar(15) NT NULL, NID varchar(15) NT NULL, MINid varchar(15) NT NULL ) CREATE INDEX IX_#TMP2_UB_USRDETBYSIDNID2 N #TMP2_UB_USRDETBYSIDNID2(PMM_DATETIME, SID, NID) -- INICI CURSR PARA BTENER LAS ESTADISTICAS PR CADA UN DE LS SID/NID ACTIVS EN LA TABLA SID_NID_CENTRALES DECLARE CURSIDS CURSR FR SELECT DISTINCT(SID) AS 'SIDS', NID AS 'NID' FRM SID_NID_CENTRALES WHERE BSTATUS = 1 RDER BY SID PEN CURSIDS FETCH CURSIDS INT @CUR_SID, @CUR_NID WHILE (@@sqlstatus = 0) BEGIN -- RESPALD LAS VARIABLES SELECT @dINIT_DATE_CPY = @dINIT_DATE, @dEND_DATE_CPY = @dEND_DATE, @dEND_DATE_AUX_CPY = @dEND_DATE_AUX -- INSERT LS REGISTRS QUE SEAN IGUALES AL SID Y NID CRRESPNDIENTES EN LA 2DA TABLA TEMPRAL INSERT INT #TMP2_UB_USRDETBYSIDNID2 SELECT ID_CSV, PMM_DATETIME, @CUR_SID, @CUR_NID, MINid FRM #TMP_UB_USRDETBYSIDNID2 WHERE SID = @CUR_SID AND NID = @CUR_NID -- SE BTIENE TDA LA INFRMACIN DE LA TABLA DE RIGEN DESDE EL INTERVAL INICIAL AJUSTAD HASTA EL INTERVAL FINAL EXACT WHILE (@dINIT_DATE <= @dEND_DATE) BEGIN SELECT @iTTAL = 0, @iTTAL_BAZ = 0, @iTTAL_EKT = 0, @iTTAL_IUS = 0, @USRS_BAZ = 0, @USRS_EKT = 0, @USRS_IUS = 0, @USRS_TT = 0 SELECT @USRS_BAZ = ****(DISTINCT(A.MINid)) FRM #TMP2_UB_USRDETBYSIDNID2 A, usr_mines B WHERE A.PMM_DATETIME BETWEEN @dINIT_DATE AND @dEND_DATE_AUX AND A.SID = @CUR_SID AND A.NID = @CUR_NID AND B.corpo_id = 'BAZ' AND A.MINid = B.MIN_id SELECT @USRS_EKT = ****(DISTINCT(A.MINid)) FRM #TMP2_UB_USRDETBYSIDNID2 A, usr_mines B WHERE A.PMM_DATETIME BETWEEN @dINIT_DATE AND @dEND_DATE_AUX AND A.SID = @CUR_SID AND A.NID = @CUR_NID AND B.corpo_id = 'EKT' AND A.MINid = B.MIN_id DELETE #TMP2_UB_USRDETBYSIDNID2 FRM #TMP2_UB_USRDETBYSIDNID2 A, usr_mines B WHERE A.PMM_DATETIME BETWEEN @dINIT_DATE AND @dEND_DATE_AUX AND A.SID = @CUR_SID AND A.NID = @CUR_NID AND (B.corpo_id = 'EKT' R B.corpo_id = 'BAZ') AND A.MINid = B.MIN_id SELECT @USRS_IUS = ****(DISTINCT(MINid)) FRM #TMP2_UB_USRDETBYSIDNID2 WHERE PMM_DATETIME BETWEEN @dINIT_DATE AND @dEND_DATE_AUX AND SID = @CUR_SID AND NID = @CUR_NID SELECT @USRS_TT= ISNULL(@USRS_BAZ,0)+ISNULL(@USRS_EKT, 0)+ISNULL(@USRS_IUS,0) -- ACTUALIZA EL REGISTR EXISTENTE CN LAS NUEVAS CANTIDADES BTENIDAS. UPDATE UB_USRDETBYSIDNID SET SID = @CUR_SID, NID = @CUR_NID, USRS_BAZ = ISNULL(@USRS_BAZ,0), USRS_EKT = ISNULL(@USRS_EKT,0), USRS_IUS = ISNULL(@USRS_IUS,0), USRS_TT = ISNULL(@USRS_TT,0) WHERE PMM_DATETIME = @dINIT_DATE AND SID = @CUR_SID AND NID = @CUR_NID IF @@RW**** = 0 BEGIN -- SIGNIFICA QUE N HAY INFRMACIN EN LA TABLA DESTIN PARA EL INTERVAL DE TIEMP EN CUESTIN, ES NUEV INSERT INT UB_USRDETBYSIDNID VALUES(@dINIT_DATE,@CUR_SID,@CUR_NID,ISNULL(@USRS_ BAZ, 0),ISNULL(@USRS_EKT,0),ISNULL(@USRS_IUS,0),ISNULL( @USRS_TT,0)) END DELETE #TMP2_UB_USRDETBYSIDNID2 WHERE PMM_DATETIME BETWEEN @dINIT_DATE AND @dEND_DATE_AUX AND SID = @CUR_SID AND NID = @CUR_NID -- INCREMENT LAS VARIABLES. SELECT @iCNTADR = @iCNTADR + 1 SELECT @dINIT_DATE = (SELECT DATEADD(ss, 300,@dINIT_DATE)) SELECT @dEND_DATE_AUX = (SELECT DATEADD(ss, 299,@dINIT_DATE)) END -- RECUPER LAS VARIABLES. SELECT @dINIT_DATE = @dINIT_DATE_CPY, @dEND_DATE = @dEND_DATE_CPY, @dEND_DATE_AUX = @dEND_DATE_AUX_CPY DELETE #TMP_UB_USRDETBYSIDNID2 WHERE SID = @CUR_SID AND NID = @CUR_NID FETCH CURSIDS INT @CUR_SID, @CUR_NID -- LIMPI LA TABLA LA 2DA TABLA TEMPRAL TRUNCATE TABLE #TMP2_UB_USRDETBYSIDNID2 END CLSE CURSIDS DEALLCATE cursor CURSIDS SELECT @END_PRC = (SELECT GETDATE()) SELECT 'ERRR'=0,'ERRR_DESC'= 'MVIMIENT EXITS SE REALIZARN ' + CNVERT(VARCHAR(12),@iCNTADR) + ' INSERCINES A LA TABLA UB_USRDETBYSIDNID2 ' + ' EL PERID DE EJECUCIN FUE DE: ' + CNVERT(VARCHAR(19),CNVERT(VARCHAR(10),@INIT_PRC,10 2) + ' ' + CNVERT(VARCHAR(8),@INIT_PRC,108)) + ' HASTA ' + CNVERT(VARCHAR(19),CNVERT(VARCHAR(10),@END_PRC,102 ) + ' ' + CNVERT(VARCHAR(8),@END_PRC,108)) RETURN 0 |
|
#2
|
|||
|
|||
|
Optimizar stored procedure
Alguien me podria decir como puedo hacer este stored procedure mas rapido?? <
Check if you can replace creating temp tables by views or a simple SELECT statement and avoid cursors as they create performance bottlenecks - in most cases there is a set oriented solution possible. brgds Philipp Post |
![]() |
| Viewing: Web Development Archives > FAQs > Databases > Optimizar stored procedure |
| Thread Tools | Search this Thread |
| Display Modes | Rate This Thread |
|
|
|
|