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

Для нашей почтовой системы я решил завести черный список 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
05.04.2004, 08:56
    #32468487
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
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
05.04.2004, 09:13
    #32468498
IgorK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
авторбаза разрослась до 700 метров.
Сделай BACKUP-RESTORE и база ужмется и мусор соберется.
авторкак сделать так, чтобы и записи обновлялись много и часто и не тормозил уборщик мусора? если это он, конечно
Даже нужно - sweep interval=0, а по ночам делать backup с параметром -g
...
Рейтинг: 0 / 0
05.04.2004, 09:56
    #32468543
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
2Zmeishe
по поводу флага и порядка действий.
дело в том, что почтовый сервер должен иметь доступ к полному набору данных в любой момент времени.
при этом он делает запрос вида
select * from blackiplist where ip like '%12.23.34.45' and flag=0

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

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

Если наоборот, НУЖНА проверка на существование IP, то могу предложить другую методику.
...
Рейтинг: 0 / 0
05.04.2004, 11:08
    #32468679
vvHedgehog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
Ну и кто говорил, что временные таблицы это лишний инструмент?
...
Рейтинг: 0 / 0
05.04.2004, 11:16
    #32468700
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
я извиняюсь.
я вас обманул насчет примари кей.
нет там примари кей.
есть составной индекс из ip и flag.
дело в том, что новый набор строк, должен быть единственно присутствующим в базе. он на 99% дублирует старый набор, но я не знаю какие строки добавились, а какие удалились.
мне показалось прощще перезаписывать всю таблицу.
может быть я не прав.
...
Рейтинг: 0 / 0
05.04.2004, 11:50
    #32468773
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
...
Рейтинг: 0 / 0
05.04.2004, 11:51
    #32468779
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
Ну Вы, блин, даёте! Чтоб из-за 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
05.04.2004, 17:40
    #32469537
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
2Zmeishe
вижу смысл, спасибо
...
Рейтинг: 0 / 0
07.04.2004, 08:48
    #32471468
IgorK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
Вообще для Интербэйса массовые удаления без последующего backup-restore не очень хороший режим работы. Т.к. база пухнет и далее по пунктам...
ИМХО для такого режима лучше использовать что-то типа MySQL - шустрее будет работать.
...
Рейтинг: 0 / 0
07.04.2004, 09:06
    #32471488
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
IgorKВообще для Интербэйса массовые удаления без последующего backup-restore не очень хороший режим работы. Т.к. база пухнет и далее по пунктам...
Теоретически согласен. BackUp-Restore регулярно нужен. У меня каждую ночь BackUp и раз в неделю BackUp-Restore. Но.
Массовые удаления, в данном конкретном случае, происходят в служебной таблице. Она НЕ используется в работе почтового сервера в режиме 24х7. По ней не происходит ежесекундного поиска. А в рабочей таблице всех изменений всего 1%, несмотря на массовость заливки и удаления. Я не думаю, что "...далее по пунктам..." приведёт к снижению производительности в целом.
...
Рейтинг: 0 / 0
07.04.2004, 09:13
    #32471498
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
сделал так:
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
07.04.2004, 09:16
    #32471500
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
по поводу mysql
если уж так, то возможно сделать просто бинарный файл. размером в (2^32)/256 байт(примерно 500 метров).
где каждый бит соответствует одному ip адресу.
скорость я думаю юудет более чем приемлемая, а размер базы у меня сейчас итак 300 с лишним метров.
...
Рейтинг: 0 / 0
07.04.2004, 09:29
    #32471526
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
>> вставка происходит примерно 700 строк в секунду(это больше часа
работы)
Я не знаю как ты делаешь вставку записей, но я на Celeron 2 ГГц и на Win2000Proff (не Linux и не Unix) 1.5 млн записей из 20 полей insert за 7-9 мин.
Может быть ты не отключил индекс?

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

мож у меня клиентская прога тормозит?
...
Рейтинг: 0 / 0
07.04.2004, 09:51
    #32471567
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
Каким компонентом пользуешься? Приведи кусок кода проги, где идёт вставка.
...
Рейтинг: 0 / 0
07.04.2004, 10:17
    #32471625
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
Поскольку заливка и обновление идёт одновременно с работой почтовика, то 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
07.04.2004, 11:04
    #32471742
Roman Ignatiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
ZmeisheНе помню я, как называется API функция перевода IP из строки в число inet_addr & inet_ntoa
...
Рейтинг: 0 / 0
07.04.2004, 13:02
    #32471969
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
да я же написал, что ip integer!!!
к стати, когда я сделал во временной таблице ip integer primary key, обновление из одной таблицы в другую произошло за 5 минут!!!
...
Рейтинг: 0 / 0
07.04.2004, 13:12
    #32471984
Zmeishe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
3 миллиона записей
БЛИН!!! "ТВОЮ МАТЬ, ТВОЮ МАТЬ" - СКАЗАЛ ПЕРЕВОДЧИК ВИДЕО-ФИЛЬМА.

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

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


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