[EMAIL PROTECTED] wrote:

>       Hello
> 
>       I got another problem few weeks ago. In quick: I need 
> to store a variable 
> for monitoring graph, collected at 5 minutes. I also don't 
> want to use rrdtool, 
> nor mrtg but to extract the data directly from a database, to 
> create charts
> (600 values each) on 3 basic periods: day, month, year. I 
> need to extract only 
> precomputed averages for the month and year (~600 rows), for 
> the speed, and I 
> don't want to precompute them in the application. So here is 
> the table, and the 
> trigger to get all the work inside the sapdb, and my question 
> is if exists other
> ways to do that (in order of speed or elegance).
> 


You are using the set-function COUNT.
But why do you not use the set-function SUM as well?

Instead of
  DECLARE c02h CURSOR FOR SELECT val FROM dbc.orx WHERE h >= :lasth and avgt = 0;
and doing a loop with
          SET j = j + i ;
          FETCH NEXT c02h INTO :i ;
perhaps a 
DECLARE c02h CURSOR FOR SELECT sum(val) FROM dbc.orx WHERE h >= :lasth and avgt = 0;
would be fine.

But you want to have the AVG and a function AVG is available, too.

And if you will combine the insert and the select, something like
INSERT INTO dbc.orx (h, val, avgt) as
 SELECT :new.h,AVG(val),1 FROM dbc.orx WHERE h >= :lasth and avgt = 0;

is normal SQL (see reference manual), much shorter than your loop with something
in the end and should improve the performance.

Elke
SAP Labs Berlin

> create table dbc.orx (
>       id serial primary key, 
>       h fixed(10,0),            -> unix time
>       val FIXED(10,0),          -> value
>       avgt int)                 -> average type
> 
> insert 3 averages :
> 
> session.sql ('insert into dbc.orx (h ,val ,avgt) values ( 
> '1043324062','0',1 )')
> session.sql ('insert into dbc.orx (h ,val ,avgt) values ( 
> '1043324063','0',2 )')
> session.sql ('insert into dbc.orx (h ,val ,avgt) values ( 
> '1043324064','0',3 )')
> 
> 
> avg 1 is for 1800 seconds
> avg 2 is for 7200 seconds
> avg 3 is for 86400 seconds
> 
> 
> 
> CREATE TRIGGER mkavg FOR dbc.orx AFTER INSERT EXECUTE (
> VAR
> lasth FIXED(10,0) ;
> i FIXED(10,0) ;
> q FIXED(10,0) ;
> j FIXED(10,0) ;
> x FIXED(10,0) ;
> difh  FIXED(10,0) ;
> 
> SET j = 0;
> SET x = 0;
> SET q = 0;
> 
>   DECLARE c01h CURSOR FOR SELECT h FROM dbc.orx WHERE avgt = 1 ;
>   FETCH LAST c01h INTO :lasth;
>   CLOSE c01h;
>   SET difh = h - lasth ;
>   IF ( difh >= 1800 ) THEN 
>     BEGIN 
>       DECLARE c02h CURSOR FOR SELECT val FROM dbc.orx WHERE h 
> >= :lasth and avgt = 0;
>       FETCH c02h INTO :i ;
>       WHILE $RC = 0 DO 
>         BEGIN 
>           SET j = j + i ;
>           FETCH NEXT c02h INTO :i ;
>         END ;
>       CLOSE c02h ;
>       SELECT count(*) FROM dbc.orx WHERE h >= :lasth and avgt = 0;
>       FETCH LAST INTO :x;
>       SET q = j / x ;
>       INSERT INTO dbc.orx (h, val, avgt) VALUES (:new.h, :q, 1) ;
>     END ;
> 
>   DECLARE c11h CURSOR FOR SELECT h FROM dbc.orx WHERE avgt = 2 ;
>   FETCH LAST c11h INTO :lasth;
>   CLOSE c11h;
>   SET difh = h - lasth ;
>   IF ( difh >= 7200 ) THEN 
>     BEGIN 
>       DECLARE c12h CURSOR FOR SELECT val FROM dbc.orx WHERE h 
> >= :lasth and avgt = 1;
>       FETCH c12h INTO :i ;
>       WHILE $RC = 0 DO 
>         BEGIN 
>           SET j = j + i ;
>           FETCH NEXT c12h INTO :i ;
>         END ;
>       CLOSE c12h ;
>       SELECT count(*) FROM dbc.orx WHERE h >= :lasth and avgt = 1;
>       FETCH LAST INTO :x;
>       SET q = j / x ;
>       INSERT INTO dbc.orx (h, val, avgt) VALUES (:new.h, :q, 2) ;
>     END ;
> 
>   DECLARE c21h CURSOR FOR SELECT h FROM dbc.orx WHERE avgt = 3 ;
>   FETCH LAST c21h INTO :lasth;
>   CLOSE c21h;
>   SET difh = h - lasth ;
>   IF ( difh >= 86400 ) THEN 
>     BEGIN 
>       DECLARE c22h CURSOR FOR SELECT val FROM dbc.orx WHERE h 
> >= :lasth and avgt = 2;
>       FETCH c22h INTO :i ;
>       WHILE $RC = 0 DO 
>         BEGIN 
>           SET j = j + i ;
>           FETCH NEXT c22h INTO :i ;
>         END ;
>       CLOSE c22h ;
>       SELECT count(*) FROM dbc.orx WHERE h >= :lasth and avgt = 2;
>       FETCH LAST INTO :x;
>       SET q = j / x ;
>       INSERT INTO dbc.orx (h, val, avgt) VALUES (:new.h, :q, 3) ;
> 
>     END ;
> IF $rc = 0 THEN STOP($rc) ;
> )
> 
> 
> 
> 
> Regards
> 
>       dim
> 
> _______________________________________________
> sapdb.general mailing list
> [EMAIL PROTECTED]
> http://listserv.sap.com/mailman/listinfo/sapdb.general
> 
_______________________________________________
sapdb.general mailing list
[EMAIL PROTECTED]
http://listserv.sap.com/mailman/listinfo/sapdb.general

Reply via email to