Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
С Postgree работаю недавно, раньше работал на Mysql, но так как хочется все сделать хорошо, прошу вашего совета. Есть задача: скидывать данные о трафике в таблицу. Поля такие: ip_from, ip_to, bytes,time. ip_to - наша сеть, ограниченое число IP адресов (маска 20) ip_from - любой возможный IP (нужен ли в этом случае индекс?) В таблицу данные будет скидывать утилита из flow-tools, соответственно, как она будет туда их скидывать (COPY или insert), я не знаю. Затем надо будет из этой таблицы брать данные, и каждому IP из ip_from сопоставлять тип трафика (int2, всего возможных типов не более 20), т.е. соединять эту таблицу с другой таблицей по полю ip_from (тип inet). Как лучше организовать эту таблицу? (имеется ввиду индексы и другие возможности Postgreesql, типа OID и т.д.) Естественно, хочется чтобы работало быстро. PostgreSQL v7.4.6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2005, 09:18 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Делай не так делай 2 таблицы 1. Справочник трафиков. 2. Твоя таблица, но в нее добавь пол которое будет ссылаться на справочник трафиков ip_from, ip_to, bytes,time, tr_Type обязательно добавь еще пол ID это будет запись определять уникально, чтобы ты мог к ней обратиться к одной тельно.. (primary key) Потом индексы зависят от того по каким полям будут выборки делаться т.е. к примеру надо будет часто выбирать поля с ip_from такимто значит сюда индекс присобач, а если с ip_form и ip_to то на два этих поля... тут сразу и не скажешь. O*R*A*C*L*E (Don't despair my little fried...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2005, 11:51 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Поле tr_Type сюда не добавить, т.к. данные о трафике в таблицу кидаются автоматически, и только потом уже отдельно я буду определять тип трафика. Я рассатриваю эту таблицу как временную, потому что затем данные будут преобразовываться и закидываться в другую таблицу, уже с типом трафика и другими данными (id клиента). Таким образом, данные из этой таблицы будут выбираться только 1 раз (соединение по ip_from), после этого она будет стираться. При обработке за 1 раз будет обрабатываться примерно по 2000 строк. Интересует вопрос: а стоит ли создавать индекс, если каждый раз его придется перестраивать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2005, 12:05 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
2Oracle - зачем заводить справочник для 20 позиций, не тот объем походу (Кстати ,автор мог бы предположить средний объем обрабатываемой информации, размер таблицы) ID тоже имхо не особо целесообразно - в базе данных из 2-3 таблиц искусственные примари ключи имеют сомнительную ценность, обращение к 1 строке достигнется и оидом. К тому же вряд ли там нужно будет смотреть по строкам - скорее за период будут суммироваться траффики и выдаваться результаты... ОЧень похоже на траффикорезалку =) .. Тут несколько вариантов - если авторЗатем надо будет из этой таблицы брать данные, и каждому IP из ip_from сопоставлять тип трафика (int2, всего возможных типов не более 20), т.е. соединять эту таблицу с другой таблицей по полю ip_from (тип inet). нужно будет сопоставлять часто и вторая таблица есть то можно повесить триггер на события вставки, который бы заполнял поле tr_type , не важно что данные тулзой бросаются - на каждый инсерт это поле заполняется триггером.... Если нужна статистика по суммам траффика для каждого ип и нужна часто, то можно на крон повесить ф-цию, которая агрегирует статистику раз в 1-2 минуты или чаще и складывает в отдельную табличку, а на основе этой небольшой таблицы (все ип адреса как строки - и по кол-ву столбцов -типов траффика - суммы за периоды времени) уже делаются выводы. для простой задачи решения не должны быть универсальными и всеобъемлющими =)) Лучше применять бритву оккама, чем грабли оккама. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2005, 22:49 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Насчет oid - если поток данных прокачиваемый через таблицу за день каким-то чудом увеличится до миллиона, то примерно через 10 лет oid может перескочить через 4 миллиарда и придёт пушной зверёк (поскольку oid - глобальный счетчик для всей базы). Маловероятно, но вдруг. (4+4+4+8+28)*2000 = 93K ~ 12 страниц. На хорошем железе все будет быстро и без индекса, на перестройку которого больше времени уйдет. Если проверка целостности будет в процедуре обработки, то не надо никаких констрейнтов на эту временную табличку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2005, 04:14 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
2фффф =)а сделав дамп-ресторе этой базы без оидов мы их уплотним и можно получить еще 10 лет пользования =) , если конечно не количество записей в таблице превысит 4 млрд =).... А если так то и сериал не думаю что долго продержится - инт4 все таки, тогда uunid нужен =), но думаю там задача проще, судя по описанию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2005, 08:34 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
около 2-х миллионов строк в день будет обрабатываться. Так все-таки WITH OIDS или WITHOUT OIDS? Postgree такие возможности предлагает, а я взять не могу :) В документации про это один абзац написан, и ничего про производительность. Если WITHOUT OIDS - это сильно плохо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2005, 08:49 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
centur2Oracle - зачем заводить справочник для 20 позиций, не тот объем походу (Кстати ,автор мог бы предположить средний объем обрабатываемой информации, размер таблицы) ID тоже имхо не особо целесообразно - в базе данных из 2-3 таблиц искусственные примари ключи имеют сомнительную ценность, обращение к 1 строке достигнется и оидом. К тому же вряд ли там нужно будет смотреть по строкам - скорее за период будут суммироваться траффики и выдаваться результаты... ОЧень похоже на траффикорезалку =) .. Тут несколько вариантов - если авторЗатем надо будет из этой таблицы брать данные, и каждому IP из ip_from сопоставлять тип трафика (int2, всего возможных типов не более 20), т.е. соединять эту таблицу с другой таблицей по полю ip_from (тип inet). нужно будет сопоставлять часто и вторая таблица есть то можно повесить триггер на события вставки, который бы заполнял поле tr_type , не важно что данные тулзой бросаются - на каждый инсерт это поле заполняется триггером.... Если нужна статистика по суммам траффика для каждого ип и нужна часто, то можно на крон повесить ф-цию, которая агрегирует статистику раз в 1-2 минуты или чаще и складывает в отдельную табличку, а на основе этой небольшой таблицы (все ип адреса как строки - и по кол-ву столбцов -типов траффика - суммы за периоды времени) уже делаются выводы. для простой задачи решения не должны быть универсальными и всеобъемлющими =)) Лучше применять бритву оккама, чем грабли оккама. Справочник надо для пооддержания целосности БД, а количество записей в нем никакой роли не играет, их может быть хоть 2 хоть 20000. Это основы БД. на не потом форин вешается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2005, 14:13 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Ссылка на таблицу типов трафика будет, для целостности. 2 года база работала в mysql, без внешних ключей. Так там теперь такое творится!.. Вот насчет триггеров - спасибо, мне кажется, это хорошая идея....можно автоматом и другие поля заполнять.. Посмотрю, что можно сделать P.S. Настроил сегодня утилиту, запустил ее, оказалось, что она insert-ами вставляет.. Оказалось долго... 25тыс записей около минуты... Рассмотрю вариант экспорта данных в файл, а потом в базу с помощью COPY. Только вот триггеры вроде не срабатывают, если через COPY вставлять? Пошел доки читать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2005, 21:10 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
2Дмитрий: А данные потом будут убиваться ? сколь долго нужна будет тзапись вставленная "сегодня" т.е. актуальность, если вчерашние записи будут удаляться то можно сделать "грязно" но быстро, если же нужно строить каркас БД и она потом будет расти и вырастать в терабайтных монстров, распределенных в пространстве - тогда да - и справочники и желательно "шифры", т.е. не числовые а строковые идентификаторы. и проектирование желательно.. Качественное. Да, триггера не срабатывают при копи, надо будет писать тогда процедуры обработки, которые бы по готовой таблице ее шерстили. Хотя опять же оцени - так ли медленно это : твои 2 млн введутся за 25.000*4*10*2 - 80 минут на все -5.5% всего времени в сутки, если тулза тебе это за раз выкатывает - плохо, а если по 10.000 записей каждые n минут - ну и инсерти себе потихонечку, распределяя нагрузку... копи дороже будет писать =).. Ты не торопись - оцени как сильно будет развиваться проект, если это "сдал забыл" - делай все просто и быстро, если это твоя основная работа - делай так чтобы потом не переделывать 2Oracle не надо повторять заученные вещи, поработай с 10-20 справочниками в две записи, а я руками check повешу. и будет та же целостность, меньшая гибкость и расширяемость, но опять же - если для задачи этого хватит, и в дальнейшем больше ничего не понадобится - зачем усложнять себе жизнь.. А если объем справочников будет как у нас, 250(и растет) при этом в каждом от 200 записей до 40.000 с иерархией , то тут конечно чеками не обойдешься... Да и справочники нужно тоже не банально ваять, ибо всякая взаимная репликация с 2-3 мастерами приводит к большому кол-ву матов, когда на одном мастере сериал такой, на другом еще дальше убежал, а на третьем с места не сдвинулся, а данные приходят проклассифицированные по одному из - вот и начинается увязка справочников... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2005, 20:34 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
да забыл - Without oids чуть быстрее, но потом если они понадобятся - нужно будет делать дроп таблицы и перекачку данных, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2005, 20:35 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
2centur: Это моя основная работа. 1,5 года назад я все делал на Mysql. Объемы были другие, да и цели в принципе тоже.. Но потом комания расширилась, и сейчас обработка трафика клиентов, кот. они накачали за 15 минут, происходит минут 20. Естественно, это никуда не годится. поэтому я сейчас все переделываю все на Pgsql, и уже знаю свои ошибки и недоделки в старых скриптах. В принципе, их можно просто оптимизировать и будет все работать нормально, но, как ты сказал, лучше сделать так, чтоб потом не переделывать. Поэтому, кроме просто алгоритмов, я хочу по-максимуму использовать возможности Pgsql. В начале я хотел сделать так: утилита закидывает данные во временную таблицу, затем эта временная таблица связывается по полю IP с типом трафика и с id юзера (кот. принадлежит этот ip), и полная инфа складывается в главную таблицу, где хранится весь трафик. Затем данные из временной таблицы удаляются. Но это без использования всяких возможностей pgsql. Затем, как посоветовал centur, я решил, что можно обойтись без временной таблицы, и навесить триггер, который будет все это подставлять автоматом. Вот так и попробую сделать. Хотя тут есть тоже свои тонкости: есть несколько площадок (роутеров), и при вставке данных, нужно учитывать, с какого роутера данные пришли, т.е. триггеру надо передавать данные каким-то образом. Ну это, я думаю, реализуемо (кстати есть идеи?) Про COPY: для проверки сделал таблицу из трех числовых колонок. Повесил триггер (before insert on test_table for each row execute), который при вставке суммирует первые 2 числа и вставляет сумму в третью колонку. вставлял через COPY числа например: 1,2,0 3,4,0 и в итоге у меня было в таблице 1,2,3 3,4,7 т.е. триггер сработал! Может оттого, что данных мало? или в настройках это где-то есть? Или я что-то не правильно делал? (В доках не нашел про это :( ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2005, 08:39 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
centur Да, триггера не срабатывают при копи ? триггера отключаются (системой) при подъеме дампа. Но чтобы они сами собой отрубались при простом COPY??? Можно ли ссылочку на доку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2005, 10:16 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
при COPY тригера не отрубаются это 100%, таблица: ip int8, traf_in int8, traf_out int8, сdate date уникальный индекс ip,date тригер: before insert update table set traf_in=traf_in+$itraf,traf_out=traf_out+$otraf where ip = $ip and сdate=$date if ROWS_AFFECTED=0 then return new else return NULL вставляю через COPY (~10000 записей за копу + ~лимона записей в таблице) COPY TO TABLE 345673237\t14\t14\t2005-01-01\n \. все работает на 100% и достаточно быстро если еще перед копу делать вакум аналузе то свтавка проходит менее чем за минуту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2005, 12:00 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Тогда почему COPY быстрее, чем insert? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2005, 12:27 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
потамучто в доках так написанно, считай что это аксиома :) видимо потомучто на парсиг и создание плана столько времени не уходит...+ количество передаваемых данных меньше... сейчас уже точно не помню , в посгревой рассылке поищи там вроде проскикивало обяснение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2005, 13:28 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Хмм. про копи лично не тестил, но когда у нас встал такой вопрос коллега авторитетно заявил - триггеры не живут (было ~7.3.8 и сейчас 7.4.1 постгрес) На новом завтра потестирую... Если ввел в заблуждение - извиняйте.. И вообще я всегда думал что скорость копи обуславливается именно тем, что игнорируя все ограничения и ключи эта команда пишет чуть ли не напрямую в файлы таблицы... Завтра тоже уточню у спеца нашего, который субд дорабатывает. 2Дмитрий - ну тогда все основательно делай, раз на этом дальше вертеться... А параметр можешь попробовать передавать как еще один столбец копи. как вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2005, 22:34 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Такая мысль: 1*PREPARE + n*EXECUTE в одной транзакции по скорости должно вплотную к COPY приближаться, за счет снижения затрат на парсинг/оптимизацию и небольшое сокращение текста запроса. Кто-нибудь тестировал такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 06:08 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
В доках нашел, что триггеры выполняются при COPY: COPY FROM will invoke any triggers and check constraints on the destination table. However, it will not invoke rules. Это вот тут: http://www.postgresql.org/docs/7.4/interactive/sql-copy.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 07:40 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Скрябин ДмитрийВ доках нашел, что триггеры выполняются при COPY: COPY FROM will invoke any triggers and check constraints on the destination table. However, it will not invoke rules. Это вот тут: http://www.postgresql.org/docs/7.4/interactive/sql-copy.html спасибо, пойду "позорить" коллегу. offtop^ рекомендую хелп из pgAdmin он в compiled html - очень удобно.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 08:31 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
Скрябин ДмитрийВ доках нашел, что триггеры выполняются при COPY: COPY FROM will invoke any triggers and check constraints on the destination table. However, it will not invoke rules. Это вот тут: http://www.postgresql.org/docs/7.4/interactive/sql-copy.html не думаю что из за рул(т.е из за отсуствия рул) так скорость увеличивается. Centur offtop^ рекомендую хелп из pgAdmin он в compiled html - очень удобно.. только не факт что эти доки к той версии ПГ которая на сервере.. 7.4 и 8.0 не очень сильно, но отличаются. а так вобщем поддерживаю рекомендации :) prepare my_plan insert (a,b,c) values (?,?,?); for(0..n) { execute my_paln(1,2,3); } работает медленнее чем COPY - проверяно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2005, 10:17 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
wbear Centur offtop^ рекомендую хелп из pgAdmin он в compiled html - очень удобно.. только не факт что эти доки к той версии ПГ которая на сервере.. 7.4 и 8.0 не очень сильно, но отличаются. а так вобщем поддерживаю рекомендации :) В 1.0 лежат к 7.4.beta4 в 1.2 - 8.0 beta2 (или beta3,не помню) Если надо но лень ставить - могу выложить все на хост - скачай и пользуйся... PS есть тут спецы кто может объяснить почему копи работает быстрее (у меня ранее сложилось мнение, что эта команда пишет чуть ли не напрямую в файлы, игнорируя все ограничения, поэтому и быстрая такая.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 08:46 |
|
||
|
Дайте совет: как организовать таблицу
|
|||
|---|---|---|---|
|
#18+
centurPS есть тут спецы кто может объяснить почему копи работает быстрее (у меня ранее сложилось мнение, что эта команда пишет чуть ли не напрямую в файлы, игнорируя все ограничения, поэтому и быстрая такая.) Видимо как раз за счет того, (как сказал wbear), что для каждого запроса не выполняется план разбора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2005, 08:50 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=32909855&tid=2007439]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 428ms |

| 0 / 0 |
