Jak nejlépe řešit agregaci databáze na PostgreSQL 8?

Tomáš Tomáš tom.tore na seznam.cz
Neděle Duben 23 22:15:50 CEST 2006


Využívám PostgreSQL k ukládáni dat z měřici stanice běžící 7/24.
Každých 5minut se do tabulky log ulozi cca 200 vet o nasledujici strukture

Unixovy cas, nazev (text), hodnota a (double), hodnota b (double)

Data se archivuji v Dlouhých časových řadách (v současnosti cca 5let zpět) a tak je požadavek data starší 30 dnu agregovat na hodinový průměr a ukládat do tabulky logh,
data starší 180 dni agregovat na 24 hodinový průměr a ukládat do tabulky logd,

Doposud to mam napsané jako funkci, která se pouští v cronu 1x za 24hodin
Zjisti jaká jsou nejstarší data v log, provede sum pro nejstarší časový údaj + 3600 výsledek insertne do logh a smaže z log

Jednak je to docela pomale a pak mi to nepřijde jako dostatečně databázové řešení, jak by jste to řešili vy?


Děkuji 

K.K.

P.S. ta má agregační funkce upadá asi takto (doufam, ze je to ta aktuální)

*********************************************************************************************************
declare
    t_min integer;
    t_max integer;
    th integer;
    x integer default 0;

begin

while x < 24 loop

SELECT into t_min,t_max  min(that_time),max(that_time) from log;

IF (t_min+2592000)<=t_max THEN

SELECT into th  extract(epoch from date_trunc('hour',t_min::reltime));

INSERT INTO log_h SELECT name,SUM(mereni_d) AS mereni_d,
SUM(mereni_u) AS mereni_u,th+3600 AS that_time FROM log WHERE 
that_time>=th AND that_time<=th+3600 GROUP BY name;

DELETE FROM log WHERE that_time>=th AND that_time<=th+3599;

SELECT into t_min,t_max  min(that_time),max(that_time) from log_h;

IF (t_min+5184000)<=t_max THEN

SELECT into th  extract(epoch from date_trunc('day',t_min::reltime));
--RAISE NOTICE 'test%',th;
INSERT INTO log_d SELECT name,SUM(mereni_d) AS mereni_d,
SUM(mereni_u) AS mereni_u,th+86399 AS that_time FROM log_h WHERE 
that_time>=th AND that_time<=th+86399 GROUP BY name;

DELETE FROM log_h WHERE that_time>=th AND that_time<=th+86399;

end if;
end if;

x=x+1;
end loop;
return x;
end;
*********************************************************************************************************


Další informace o konferenci Test