Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как можно ускорить процедуру? / 2 сообщений из 2, страница 1 из 1
06.12.2005, 17:48
    #33420421
newbee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно ускорить процедуру?
Здравствуйте.

Есть две таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE detail
(
   date_det date NOT NULL,
   src_ip inet NOT NULL,
   dst_ip inet NOT NULL,
   bts int4 DEFAULT  0 ,
   src_int int2,
   dst_int int2
) WITH OIDS;

CREATE TABLE traffic
(
   date date NOT NULL,
   src inet NOT NULL,
   dst inet NOT NULL,
   inc int4,
   out int4
) WITH OIDS;


Функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE OR REPLACE FUNCTION detail_insert() RETURNS TRIGGER AS $$
DECLARE
        s_ip inet;
        d_ip inet;
        in_b int;
        ou_b int;
BEGIN

-- Switch ip
IF (NEW.src_ip <<= '172.16.0.0/16' OR NEW.src_ip <<= '62.231.26.0/24') THEN
        s_ip = NEW.src_ip;
        d_ip = NEW.dst_ip;
        in_b =  0 ;
        ou_b = NEW.bts;
ELSE
        s_ip = NEW.dst_ip;
        d_ip = NEW.src_ip;
        in_b = NEW.bts;
        ou_b =  0 ;
END IF;

IF (NEW.date_det IN (SELECT date FROM traffic) AND s_ip IN (SELECT src FROM
traffic WHERE date=NEW.date_det)
AND d_ip IN (SELECT dst FROM traffic WHERE date=NEW.date_det AND src=s_ip))
THEN
        UPDATE traffic SET inc = traffic.inc + in_b, out = traffic.out + ou_b
                WHERE traffic.date = new.date_det AND traffic.src = s_ip AND traffic.dst = d_ip;
ELSE
        INSERT INTO traffic VALUES(NEW.date_det, s_ip, d_ip, in_b, out_b);
END IF;

RETURN NULL;

END;
$$ LANGUAGE plpgsql;

И триггер:

Код: plaintext
1.
2.
3.
CREATE TRIGGER on_insert_detail
AFTER INSERT ON detail
        FOR EACH ROW EXECUTE PROCEDURE detail_insert();

За 10 минут происходит несколько тысяч INSERT INTO TRAFFIC,
на функции сервер отжирает весь камень. Если триггер снять загрузка процессора не превышает 3-4%. Что можно сделать (окромя покупки более мощного железа)?
...
Рейтинг: 0 / 0
06.12.2005, 18:18
    #33420523
-me-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно ускорить процедуру?
newbee
За 10 минут происходит несколько тысяч INSERT INTO TRAFFIC,
на функции сервер отжирает весь камень. Если триггер снять загрузка процессора не превышает 3-4%. Что можно сделать (окромя покупки более мощного железа)?

Вредные советы:
1. Упростить функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
CREATE OR REPLACE FUNCTION detail_insert() RETURNS TRIGGER AS $$
DECLARE
        s_ip inet;
        d_ip inet;
        in_b int;
        ou_b int;
BEGIN

-- Switch ip
IF (NEW.src_ip <<= '172.16.0.0/16' OR NEW.src_ip <<= '62.231.26.0/24') THEN
        s_ip = NEW.src_ip;
        d_ip = NEW.dst_ip;
        in_b =  0 ;
        ou_b = NEW.bts;
ELSE
        s_ip = NEW.dst_ip;
        d_ip = NEW.src_ip;
        in_b = NEW.bts;
        ou_b =  0 ;
END IF;
        UPDATE traffic SET inc = traffic.inc + in_b, out = traffic.out + ou_b
                WHERE traffic.date = new.date_det AND traffic.src = s_ip AND traffic.dst = d_ip;
        IF NOT FOUND THEN
               INSERT INTO traffic VALUES(NEW.date_det, s_ip, d_ip, in_b, out_b);
        END IF;
RETURN NULL;

END;
$$ LANGUAGE plpgsql;

2. Добавить индексы на traffic
3. Суммировать не каждый запрос, а периодически, скажем, раз в N минут (часов/дней).
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как можно ускорить процедуру? / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]