optimalizace triggeru (Postgres, ...)
Robert Vojta
vojta na ipex.cz
Pátek Prosinec 15 15:10:05 CET 2000
Zdravim,
mam vytvorene tabulky:
counters (line, from, to, stamp, stamp_zmeny)
counters_hour (line, from, to, stamp, stamp_zmeny)
counters_day (line, from, to, stamp, stamp_zmeny)
counters_month (line, from, to, stamp, stamp_zmeny)
Na te prvni tabulce mam nasazeny trigger, ktery pri zmene (insert,update)
dat v tabulce counters provede hodinovou, denni sumu a mesicni sumu
(vypis triggeru je na konci). Nemam zkusenosti s programovanim databazi
pomoci tech jejich jazyku a hledam jak to cele zoptimalizovat, aby to bylo
co nejrychlejsi. Tabulka counters bude co pet minut dostavat (insert) zhruba
1000 radku, tj. celkem rychle naroste a potom bude nejdele trva sumarizace
hour, day, month, resp. select a delete v nich.
Nemate nekdo prosim odkaz na nejaky web, ktery by se zabyval optimalizaci
pri programovani triggeru, ...
CREATE FUNCTION counters_change () RETURNS OPAQUE AS '
DECLARE
hour_stamp VARCHAR(20);
day_stamp VARCHAR(20);
month_stamp VARCHAR(20);
sums RECORD;
lineid INT8;
counter_stamp TIMESTAMP;
BEGIN
IF tg_op = ''INSERT'' OR tg_op = ''UPDATE'' THEN
counter_stamp := NEW.counterstamp;
lineid := NEW.line;
END IF;
hour_stamp := substr(counter_stamp,1,13);
SELECT INTO sums
SUM(counterfrom) as sum_from,SUM(counterto) as sum_to FROM counters
WHERE line = lineid and counterstamp like
hour_stamp || '':%'';
IF sums.sum_from ISNULL OR sums.sum_to ISNULL THEN
sums.sum_from := 0;
sums.sum_to := 0;
END IF;
DELETE FROM counters_hour
WHERE line = lineid AND counterstamp like
hour_stamp || '':00%'';
INSERT INTO counters_hour VALUES
(lineid,sums.sum_from,sums.sum_to,
timestamp(hour_stamp || '':00''),''now'');
day_stamp := substr(counter_stamp,1,10);
SELECT INTO sums
SUM(counterfrom) as sum_from,SUM(counterto) as sum_to FROM counters_hour
WHERE line = lineid and counterstamp like
day_stamp || '' %'';
IF sums.sum_from ISNULL OR sums.sum_to ISNULL THEN
sums.sum_from := 0;
sums.sum_to := 0;
END IF;
DELETE FROM counters_day
WHERE line = lineid AND counterstamp like
day_stamp || '' 00:00%'';
INSERT INTO counters_day VALUES
(lineid,sums.sum_from,sums.sum_to,
timestamp(day_stamp || '' 00:00''),''now'');
month_stamp := substr(counter_stamp,1,7);
SELECT INTO sums
SUM(counterfrom) as sum_from,SUM(counterto) as sum_to FROM counters_day
WHERE line = lineid and counterstamp like
month_stamp || ''%'';
IF sums.sum_from ISNULL OR sums.sum_to ISNULL THEN
sums.sum_from := 0;
sums.sum_to := 0;
END IF;
DELETE FROM counters_month
WHERE line = lineid AND counterstamp like
month_stamp || ''%'';
INSERT INTO counters_month VALUES
(lineid,sums.sum_from,sums.sum_to,
timestamp(month_stamp || ''-01 00:00''),''now'');
RETURN NULL;
END;
'
LANGUAGE 'plpgsql';
S pozdravem,
Robert Vojta
--
_
|-| __ Robert Vojta <vojta na ipex.cz>
|=| [Ll] IPEX, s.r.o.
"^" ====`o
Další informace o konferenci Test