PDA

View Full Version : سوال: optimizing this query



qolkaram
چهارشنبه 22 آبان 1387, 10:59 صبح
سلام
در یک جدول الارم های ( alarm ) دستگاه ها ذخیره می شود . هم شروع و هم خاتمه (CLEAR) الارم در این جدول موجود است .
با توجه به اینکه اولا دستگاه های مختلف داریم و ثانیا هر دستگاه انواع مختلفی از الارم دارند (major , critical) . کد های زیر را در plsql نوشته ام تا شروع و خاتمه هر الارم را پیدا کنم .

-- Created on 9/16/2008 by MOHAMMADNASIM.HOSSAI
declare

Clear_DATE_TIME bss.siemens_outage_alarm.DATE_TIME%TYPE ;
Clear_ENTITY_TYPE bss.siemens_outage_alarm.ENTITY_TYPE%TYPE ;
Clear_OBJ bss.siemens_outage_alarm.OBJECT%TYPE ;
Clear_ALARM_OUTAGE bss.siemens_outage_alarm.ALARM_OUTAGE%TYPE ;
Clear_ALARM_STATUS bss.siemens_outage_alarm.ALARM_STATUS%TYPE ;
Clear_ALARM_DESCRIPTION bss.siemens_outage_alarm.ALARM_DESCRIPTION1%TYPE ;

outage_DATE_TIME bss.siemens_outage_alarm.DATE_TIME%TYPE ;
outage_ENTITY_TYPE bss.siemens_outage_alarm.ENTITY_TYPE%TYPE ;
outage_OBJ bss.siemens_outage_alarm.OBJECT%TYPE ;
outage_ALARM_OUTAGE bss.siemens_outage_alarm.ALARM_OUTAGE%TYPE ;
outage_ALARM_STATUS bss.siemens_outage_alarm.ALARM_STATUS%TYPE ;
outage_ALARM_DESCRIPTION bss.siemens_outage_alarm.ALARM_DESCRIPTION1%TYPE ;



----------------------------- cursor to all cleared alarm
CURSOR CURS_Clrear IS
select
DATE_TIME ,
trim(ENTITY_TYPE) ,
trim(OBJECT) ,
trim(ALARM_OUTAGE ),
trim(ALARM_STATUS) ,
trim(case when ALARM_DESCRIPTION1= 'NIL' then ALARM_DESCRIPTION2 else ALARM_DESCRIPTION1 end )ALARM_DESCRIPTION
from bss.siemens_outage_alarm
where alarm_status ='CLEARED(5) 5' order by DATE_TIME,OBJECT;
-----------------------------
----------------------------- cursor to all start alarm
CURSOR CURS_Outage IS
select
DATE_TIME ,
trim(ENTITY_TYPE) ,
trim(OBJECT ),
trim(ALARM_OUTAGE) ,
trim(ALARM_STATUS ),
trim(case when ALARM_DESCRIPTION1= 'NIL' then ALARM_DESCRIPTION2 else ALARM_DESCRIPTION1 end) ALARM_DESCRIPTION
from bss.siemens_outage_alarm
where alarm_status <>'CLEARED(5) 5' order by DATE_TIME,OBJECT;
----------------------------


begin
open CURS_Outage;
loop
fetch CURS_Outage into outage_DATE_TIME , outage_ENTITY_TYPE , outage_OBJ , outage_ALARM_OUTAGE , outage_ALARM_STATUS , outage_ALARM_DESCRIPTION ;
exit when CURS_Outage%NotFound;
open CURS_Clrear;
loop
fetch CURS_Clrear into Clear_DATE_TIME , Clear_ENTITY_TYPE , Clear_OBJ , Clear_ALARM_OUTAGE , Clear_ALARM_STATUS , Clear_ALARM_DESCRIPTION ;
if CURS_Clrear%NotFound then
Clear_DATE_TIME := null ;
Clear_ENTITY_TYPE := null ;
Clear_OBJ := null ;
Clear_ALARM_OUTAGE := null ;
Clear_ALARM_STATUS := null ;
Clear_ALARM_DESCRIPTION := null ;

end if ;

exit when CURS_Clrear%NotFound
or
(
Clear_DATE_TIME >= outage_DATE_TIME and
Clear_ENTITY_TYPE = outage_ENTITY_TYPE and
Clear_OBJ = outage_OBJ and
Clear_ALARM_OUTAGE = outage_ALARM_OUTAGE and
Clear_ALARM_DESCRIPTION = outage_ALARM_DESCRIPTION

);

end loop;


end loop;
end;




این برنامه درست جواب میده اما بسیار کند است . جدای از الگوریتم کسی راه بهتری می تونه نشونم بده که optimize باشه . این برنامه تو یه ساعت فقط 1000 رکورد خروجی میده در صورتی که روزانه ما بیش از 50000 هزاز رکورد جدید داریم . ممنونم از همکاری شما

AminSobati
چهارشنبه 22 آبان 1387, 11:55 صبح
دوست عزیزم کد رو داخل تگ بزارید تا بشه خوند! ضمنا در چه بانک اطلاعاتی نوشتین؟