Databases
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
 
User Name:
Password:
Remember me
Go Back   Web Development Archives FAQs Databases

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Display Modes
 
Unread Web Development Archives Sponsor:
  #1  
Old May 29th, 2008, 08:10 PM
mbgbrown1
Guest
Dev Archives Newbie (0 - 499 posts)
 
Posts: n/a  
Time spent in forums:
Reputation Power:
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

Reply With Quote
  #2  
Old June 9th, 2008, 09:50 AM
Philipp Post
Guest
Dev Archives Newbie (0 - 499 posts)
 
Posts: n/a  
Time spent in forums:
Reputation Power:
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

Reply With Quote
Reply

Viewing: Web Development Archives FAQs Databases > Optimizar stored procedure


Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are Off
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest Threads | Shoutbox
Forum Jump


Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 





© 2003-2008 by Developer Shed. All rights reserved. DS Cluster 1 hosted by Hostway