pozitronik: (Yarr)
pozitronik ([personal profile] pozitronik) wrote2011-04-30 05:53 pm

В пост призываются знатные DBA

Вот в этом посте я рассказывал о своих мучениях с MySQL-базой. Победить их не удалось; несмотря на кучу уж совсем хитрых оптимизаций и подстроек, скорость записи в базу осталась неприемлимой, хоть и чуть выросла.
Было решено мигрировать на более мощный сервер с Oracle, админы выделили виртуалку с Win 2008 x64, 4 гигами памяти и Oracle 11 x64.
Оказалось, впрочем, что скорость записи в оракловую базу гораздо меньше, чем в MySQL. Да, она не падает с увеличением количества записей, но в среднем всё равно оказывается несколько меньше.

Напряг этим наших DBA, стали настраивать и подбирать оптимальное количество вставок перед commit. Я совершенно не силён в Oracle, поэтому пришлось положиться на их профессионализм; но единственное, чего мы достигли - это скорости около 500 вставок в секунду из любого приложения (я написал для тестов скрипт на PHP и бинарник на Delphi). Выполнение тех же вставок из sql-файла через sqlplus занимает раз в пять меньше времени (тоже медленно, я считаю, но для нужд проекта скорость приемлимая) - но если запускать sqlplus отдельно. Если запустить sqlplus из скрипта (через exec()) или приложения (CreateProcess()) - получаются те же 500 вставок в секунду.
И это выводит меня из себя уже.
DBA пожимают плечами и предлагают писать PL/SQL процедуры, которые будут грузить данные напрямую - мол, это совсем быстро. Но изучение ещё одного яп в мои планы пока что не входит, больно долго.
Приму любой совет, мой разум близится к коллапсу, я перестаю чувствовать вкус еды, различать цвета, запахи и мне снятся кошмары.

[identity profile] sedictor.livejournal.com 2011-04-30 04:36 pm (UTC)(link)
Хм, а пробовал HandlerSocket для Mysql?

[identity profile] pozitronik.livejournal.com 2011-04-30 04:57 pm (UTC)(link)
HandlerSocket не пробовал, но насколько я знаю, это решение для ускорения чтения из БД. А проблемы с записью. Косяк, видимо, в самой структуре MyISAM - скорость вставки падает пропорционально росту базы.

О, кстати, идея: в таблице используется два индекса, может быть тормоза при добавлении индексных полей. Попробую отключить индексы, если поможет, будет понятно, в какую сторону думать.

[identity profile] nik-vr.livejournal.com 2011-04-30 04:40 pm (UTC)(link)
Хех... На днях писал конвертор, который потрошит базу FoxPro и билдит из неё пригодную для Web базу SQLite. За 1,5 сек. 32 тысячи записей считаны, обработаны, записаны в новую БД. Всё делается одним commit'ом.

Но для постоянной высокой нагрузки на запись SQLite - не вариант.

[identity profile] pozitronik.livejournal.com 2011-04-30 05:05 pm (UTC)(link)
В пустую MyISAM-таблицу запись идёт со скоростью ~200000 вставок в секунду, потом начинает падать. С Oracle, если вставку делать через PL/SQL-процедуру, генерящую рандомные данные для инсерта, получается около миллиона записей в секунду (и скорость постоянна). Но почему-то при выполнении готового sql-файла содержащего ничем не отличающиеся вставки, скорость совсем никакая.

[identity profile] cybernatic-cat.livejournal.com 2011-04-30 09:22 pm (UTC)(link)
DBA абсолютно правы: если от Оракла нужна скорострельность - значит, код надо выносить на сервер. OCI слишком тяжеловесен и неповоротлив, чтобы летали и клиентские запросы тоже.

[identity profile] pozitronik.livejournal.com 2011-05-01 04:30 am (UTC)(link)
Ясно, спасибо.