Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация алгоритма или как юзать постгрис / 6 сообщений из 6, страница 1 из 1
20.10.2006, 21:42
    #34071363
f@t@list
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация алгоритма или как юзать постгрис
Привет всем!

Есть задача, которая на данный момент реализована на MySQL.
имеем таблицу tarif_zone_defs вида (CIDR, tarif_zone) в которой прописываемсто-то типа:
(62.64.0.0/18, Украина)
(212.0.0.5/32, Вася_Пупкин_продающий_свои_фильмы)

иимеем таблицу, в которую сваливаем netflow статистику, а именно:
(srcIP, dstIP, bytes).

исходя из поставленной задачи тарификации трафика (по направлениям и по зонам) был написан триггер, который, собсно, при вставке записи в таблицу netflow определял зоны, направления, стоимость и т.д. Цена такого триггера в текущей реализации - 14 селектов из порядка 20-ти таблиц, и 5 или 6 апдейтов (реализация временнЫх регистров или периодических данных).

это предыстория, а теперь собственно вопрос.
очень хотца конструкцию вида
SELECT * FROM tarif_zone_defs tz WHERE @srcIP << CIDR;
SELECT * FROM tarif_zone_defs tz WHERE @dstIP << CIDR;

заменить на один запрос к одной таблице, но! конструкция вида
CREATE VIEW tarif_zone_concats AS
SELECT st.CIDR, st.tarif_zone, dt.CIDR, dt.tarif_zone FROM tarif_zone_defs st, tarif_zone_defs dt;
с последующим поиском по представлению жутко тормозит хоть с индексами, хоть без таковых. примерно одинаково.

подскажите, плз, какие могут быть варианты реализации. как пример объемов - сейчас в таблице netflow порядка миллиарда записей, и каждые 5 минут туда сваливается около 5-20 тыс записей... соотвецтвенно каждую надо тарифицировать и здесь дорога каждая наносекунда.

--
Каждую секунду с поверхности жидкости в незакупоренной бутылке водки испаряется семь мономолекулярных слоев спирта! (с) народный фольклор
...
Рейтинг: 0 / 0
21.10.2006, 13:59
    #34071710
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация алгоритма или как юзать постгрис
Сложно что либо понять..

автор
SELECT * FROM tarif_zone_defs tz WHERE @srcIP << CIDR;
SELECT * FROM tarif_zone_defs tz WHERE @dstIP << CIDR;

Чем отличаются эти два запроса?

под netflow есть свои базы, которые оптимизированны под такие задачи.
...
Рейтинг: 0 / 0
21.10.2006, 15:13
    #34071790
f@t@list
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация алгоритма или как юзать постгрис
Алексей КлючниковСложно что либо понять..
сголасен, слишком абстрактоно описал задачу.вчера писал вечером, задолбаный...

Алексей Ключников
автор
SELECT * FROM tarif_zone_defs tz WHERE @srcIP << CIDR;
SELECT * FROM tarif_zone_defs tz WHERE @dstIP << CIDR;

Чем отличаются эти два запроса?

тем, что первый ищет соответствие по адресу источника, а второй - назначения, соответственно.

Алексей Ключников
под netflow есть свои базы, которые оптимизированны под такие задачи.
подскажите, плз, что это за базы... я таких не нашел.
...
Рейтинг: 0 / 0
21.10.2006, 22:30
    #34072106
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация алгоритма или как юзать постгрис
f@t@list

SELECT * FROM tarif_zone_defs tz WHERE @srcIP << CIDR;
SELECT * FROM tarif_zone_defs tz WHERE @dstIP << CIDR;

CREATE VIEW tarif_zone_concats AS
SELECT st.CIDR, st.tarif_zone, dt.CIDR, dt.tarif_zone FROM tarif_zone_defs st, tarif_zone_defs dt;



Странное какото у вас представление. Ни совсем понятно чего вы в нем хотели обеденить...
Насколько я понимаю, вам просто нужно проверить, входит ли срц ИП ИЛИ дст ИП в сетку (т.е. в соответствующую зону)? Тогда надо просто сделать

Код: plaintext
1.
   SELECT * FROM tarif_zone_defs tz WHERE srcIP << CIDR OR dstIP << CIDR;
А то что у вас написанно в представлении.. не удивительно что оно трмозит :-) Поскольку ваше представление возвращает "Количество сторок в таблице" * "Количество строк в таблице" строк!!! Если очень хочеться, можно запрос сделать таким :
Код: plaintext
1.
 SELECT tarf_zone, CIDR AS src_CIDR,  CIDR AS dst_CIDR FROM tarif_zone_defs;
Но зачем?
...
Рейтинг: 0 / 0
22.10.2006, 11:13
    #34072307
f@t@list
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация алгоритма или как юзать постгрис
сорри, все оказалось проще...

SELECT INTO zones
src.zone_id AS src_zone_id,
src.owner_id AS src_owner_id,
dst.zone_id AS dst_zone_id,
dst.owner_id AS dst_owner_id
FROM
tarif_zones_prefixes src,
tarif_zones_prefixes dst
WHERE
NEW.src_ip<<=src.prefix
AND
NEW.dst_ip<<=dst.prefix
AND (
src.owner_id <> 0 OR dst.owner_id <> 0
)
ORDER BY src.zone_id ASC, dst.zone_id ASC LIMIT 1;

сеть такова, что нужно было проверять из какой тарифной зоны в каую проследовал пакет. соответственно его тарифицировать на основании каких-то правил. и задача стояла, чтобы одним! запросом определить приндлежность пакета тарифным зонам и клиентам.
в предыдущем варианте это происходило с помощью 4-х запросов...

З.Ы. если пакет не принадлежит никому из клиентов, он считается транзитным и не тарифицируется. ИМХО закрыть транзитный трафик - дело не биллинга.
...
Рейтинг: 0 / 0
23.10.2006, 16:46
    #34074694
Алексей Ключников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация алгоритма или как юзать постгрис
Алексей Ключников
под netflow есть свои базы, которые оптимизированны под такие задачи.
подскажите, плз, что это за базы... я таких не нашел.[/quot]
Например
http://]http://www.splintered.net/sw/flow-tools/docs/flow-tools.html

Есть в портах Freebsd.

Загоняю туда flow.. Ни когда не приходило в голову складывать flow в sql.. но это наверно потому, что у меня нет такого мощного сервера :(.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизация алгоритма или как юзать постгрис / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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