powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / 3 миллиона записей
25 сообщений из 55, страница 1 из 3
3 миллиона записей
    #32468438
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
ятолкнулся с проблемой.

Для нашей почтовой системы я решил завести черный список ip адресов, с которых письма не будут приниматься.

наладил обновление с одного из сайтов, примерно 3 миллиона адресов.

сделал таблицу следующим образом:
create table blackiplist(ip varchar(20) not null primary key, flag integer)

затем раз в сутки заливал обновленную таблицу таким образом:
сериями по 1000 insert into blackiplist (ip,flag) values (newvalue,1)
затем после того как залил все записи, одной транзакцией:
delete from blackiplist where flag=0
update blackiplist set flag=0

вот.
работало все это часа по три.
база разрослась до 700 метров.
стал постоянно свопится диск и тормозить всю систему. хотя проверка конкретного айпишника делается практически мгновенно.
но из-за тормозов диска, сервак практически не работает.
пришлось прибить все это.
я так подозреваю, что это работает автоматический уборщик мусора.

вопрос.
можно ли сделать так:
create table(ip integer not null primary key, flag integer)?
обновлять все одной транзакцией или лучше дробить?
отключать ли индекс на первичный ключ? если это возможно вообще...
стоит ли базу разбивать на разные файлы? так, на всякий случай спрашиваю...

как сделать так, чтобы и записи обновлялись много и часто и не тормозил уборщик мусора? если это он, конечно...

FreeBSD5.2, FireVird1.5
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468487
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kсериями по 1000 insert into blackiplist (ip,flag) values (newvalue,1)
затем после того как залил все записи, одной транзакцией:
delete from blackiplist where flag=0
update blackiplist set flag=0

Насколько я понял - все новые записи имеют flag = 1 insert into blackiplist (ip,flag) values (newvalue,1) , а все старые записи имеют flag = 0;
Исходя из того, что ты написал, происходит следующее:
1. К старым записям добавляешь новые с флагом 1
2. Удаляешь старые записи с флагом 0
3. Всем оставшимся записям устанавливаешь флаг 0

Моё предложение - поменяй местами п.2 и п.1 тогда п.3 станет, скорее всего, ненужным. И не трать на него время.
1. delete from blackiplist; заметь без (where flag=0)
2. insert into blackiplist (ip,flag) values (newvalue,1)
3. update blackiplist set flag=0 (честно говоря - я не понял зачем это надо.) Зачем вообще нужен Flag, если он всегда 0.


alex_kможно ли сделать так:
create table(ip integer not null primary key, flag integer)?
Можно. Есть апишная функция перевода IP - из string в integer и обратно.
Аналога этой функции для FreeBSD5.2 я не знаю, но должен быть.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468498
IgorK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторбаза разрослась до 700 метров.
Сделай BACKUP-RESTORE и база ужмется и мусор соберется.
авторкак сделать так, чтобы и записи обновлялись много и часто и не тормозил уборщик мусора? если это он, конечно
Даже нужно - sweep interval=0, а по ночам делать backup с параметром -g
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468543
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Zmeishe
по поводу флага и порядка действий.
дело в том, что почтовый сервер должен иметь доступ к полному набору данных в любой момент времени.
при этом он делает запрос вида
select * from blackiplist where ip like '%12.23.34.45' and flag=0

новые данные закачиваются в таблицу кучей мелких транзакций(3000 примерно). поэтому они имеют флаг - 1
чтобы не мешались пока.
потом одной транзакцией убиваютя старые записи, имеющие флаг 0 и все записи( а остались только с флагом 1) помечаются флагом 0
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468583
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда объясни, в чём ПРИНЦИПИАЛЬНАЯ разница, когда удалять старые записи.
До вставки новых или после? Например, если это будет происходить в 3 часа ночи.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468655
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почтовый сервер может работать и в 3 часа ночи.
он работает с записями имеющими флаг 0.
если сначала удалить старые записи, имеющие флаг 0, то почтовому серверу неоткуда будет брать данные и спам может просочится.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468671
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух. Давай рассуждать.
Существуют ли в новом наборе, записи, которые есть в старом???
Поскольку PRIMARY KEY по IP, то в новом их не должно быть, либо вставка должна предваряться проверкой на существование IP в старом наборе.

Если в новом наборе нет IP из существующего набора, то существующий набор потерял свою актуальность и его можно нещадно удалить до вставки.

Если наоборот, НУЖНА проверка на существование IP, то могу предложить другую методику.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468679
vvHedgehog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и кто говорил, что временные таблицы это лишний инструмент?
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468700
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я извиняюсь.
я вас обманул насчет примари кей.
нет там примари кей.
есть составной индекс из ip и flag.
дело в том, что новый набор строк, должен быть единственно присутствующим в базе. он на 99% дублирует старый набор, но я не знаю какие строки добавились, а какие удалились.
мне показалось прощще перезаписывать всю таблицу.
может быть я не прав.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468773
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
3 миллиона записей
    #32468779
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну Вы, блин, даёте! Чтоб из-за 1% ТАК сервак колбасить!?

В основной таблице построй PIMARY KEY по IP. Выкини FLAG
Создай служебную таблицу, например TB$REPLICATION(IP ...);
По IP уникальный индекс, но не PIMARY KEY.
Перед заливкой нового набора данных отключи этот индекс, залей данные, подтверди все транзакции, включи индекс.

Далее выполни процедуру со следующими алгоритмами.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 /*Удалить из рабочей таблицы не актуальные записи, то есть те записи, которых нет в репликационной таблице*/ 
delete from tb_blackiplist b
where not exists (select r.ip
                        from tb$replication
                        where r.ip = b.ip);

 /*Вставить в рабочую таблицу те записи, которые есть в репликационной, но не существуют в рабочей*/ 
insert into tb_blackiplist(ip)
select r.ip
from tb$replication r
where not exists (select b.ip
                        from tb_blackiplist b
                        where b.ip = r.ip);

 /*Очистить репликационную таблицу*/ 
delete from tb$replication;

Удалять саму таблицу ни к чему. Пусть остаётся пустой до следующей репликации.
Я бы сделал два поля для IP - одно integer для этой процедуры по репликации, другое varchar(...) для твоего like '%12.23.34.45'
О результатах сообщи.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32469537
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Zmeishe
вижу смысл, спасибо
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471468
IgorK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще для Интербэйса массовые удаления без последующего backup-restore не очень хороший режим работы. Т.к. база пухнет и далее по пунктам...
ИМХО для такого режима лучше использовать что-то типа MySQL - шустрее будет работать.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471488
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorKВообще для Интербэйса массовые удаления без последующего backup-restore не очень хороший режим работы. Т.к. база пухнет и далее по пунктам...
Теоретически согласен. BackUp-Restore регулярно нужен. У меня каждую ночь BackUp и раз в неделю BackUp-Restore. Но.
Массовые удаления, в данном конкретном случае, происходят в служебной таблице. Она НЕ используется в работе почтового сервера в режиме 24х7. По ней не происходит ежесекундного поиска. А в рабочей таблице всех изменений всего 1%, несмотря на массовость заливки и удаления. Я не думаю, что "...далее по пунктам..." приведёт к снижению производительности в целом.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471498
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал так:
create table blackiplist(ip integer not null primary key)
create table blackiplisttmp(ip integer)

вставка происходит примерно 700 строк в секунду(это больше часа работы)
обновление(удаление ненужных и вставка нужных) не засекал, но больше часа.

сейчас пробую
create table blackiplisttmp(ip integer not null primary key)
скорость вставки вроде не уменьшилась.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471500
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по поводу mysql
если уж так, то возможно сделать просто бинарный файл. размером в (2^32)/256 байт(примерно 500 метров).
где каждый бит соответствует одному ip адресу.
скорость я думаю юудет более чем приемлемая, а размер базы у меня сейчас итак 300 с лишним метров.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471526
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> вставка происходит примерно 700 строк в секунду(это больше часа
работы)
Я не знаю как ты делаешь вставку записей, но я на Celeron 2 ГГц и на Win2000Proff (не Linux и не Unix) 1.5 млн записей из 20 полей insert за 7-9 мин.
Может быть ты не отключил индекс?

>>обновление(удаление ненужных и вставка нужных) не засекал, но больше часа.
Это уже не три, как раньше.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471558
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
индекс я не отключал, да.
потому что его там небыло.
create table blackiplist(ip integer)

мож у меня клиентская прога тормозит?
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471567
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким компонентом пользуешься? Приведи кусок кода проги, где идёт вставка.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471625
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку заливка и обновление идёт одновременно с работой почтовика, то like '%12.23.34.45' добавляет тормозов.
Моё предложение сделать IP - integer. Вот эту ГАДОСТЬ '%12.23.34.45' представить так:
IP_begin = IP_String_to_integer('12.23.34.45'); /* Не помню я, как называется API функция перевода IP из строки в число */
IP_end = IP_String_to_integer('912.23.34.45');

тогда вместо (ip like '%12.23.34.45')
будет (ip between :IP_begin and :IP_end)
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471742
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZmeisheНе помню я, как называется API функция перевода IP из строки в число inet_addr & inet_ntoa
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471969
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да я же написал, что ip integer!!!
к стати, когда я сделал во временной таблице ip integer primary key, обновление из одной таблицы в другую произошло за 5 минут!!!
...
Рейтинг: 0 / 0
3 миллиона записей
    #32471984
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БЛИН!!! "ТВОЮ МАТЬ, ТВОЮ МАТЬ" - СКАЗАЛ ПЕРЕВОДЧИК ВИДЕО-ФИЛЬМА.

Я ЖЕ РУССКИМ ЯЗЫКОМ НАПИСАЛ ИНДЕКС ДОЛЖЕН БЫТЬ. А ЕСЛИ ХОЧЕШЬ ПОВЫСИТЬ ПРОИЗВОДИТЕЛЬНОСТЬ ПРИ ВСТАВКЕ ЗАПИСЕЙ В СЛУЖЕБНУЮ ТАБЛИЦУ, ТО НЕ PRIMARY KEY, А UNIQUE INDEX - ПЕРЕД ВСТАВКОЙ INACTIVE ПОСЛЕ ВСТАВКИ ACTIVE. Потому, что для primary key inactive/active не сделаешь.
Оптимизируй клиента, но только по умному. И вся твоя репликация пройдёт на ура. Кофе попил и готово.
Вот, а потом кто-нибудь будет вайдосить - IB-кривой, IB-тормозной, MS-Forever
Жалко материться нельзя - самое время.
...
Рейтинг: 0 / 0
3 миллиона записей
    #32472109
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
анализ клиентского кода показал, что процентов 70 машинного времени уходит на
isc_dsql_allocate_statement

никто не сталкивался? это нормально?
...
Рейтинг: 0 / 0
3 миллиона записей
    #32472161
Roman Ignatiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя что, запрос без параметров?
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / 3 миллиона записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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