Форум: "Базы";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
ВнизПроблема с производительностью в Interbase Найти похожие ветки
← →
sndanil (2002-10-05 16:33) [0]Проблема в том, что чем больше выполнтяь оперций Commit для транзакции тем большую нагрузку испытывает сервер... так например если выполнять Commit хотябы раз в две секунды, то через час или два Athlon 850 становится загруженным на 100% и напрягает его в основном ibserver. В рамках тарнзакции производятся операции update, insert, delete, select (join)... соответственно если не выполнять Commit то все работает хорошо и компутер не напрягается более чем на 10% ..... если кто знает как с этим бороться прошу помочь... заранее благодарен.
← →
Prooksius (2002-10-05 17:15) [1]Да, и у меня был такой глюк. Как-то переносил мег 20 инфы из *,txt в базу и натыкался на зависон компа.
Долго долбался - так и не понял чего это... :-/
Вылечилось так: после 10000 коммитов делал disconnect от базы, потом снова коннектился и продолжал дальше.
Я пробовал это на IB 5.6, сейчас на FireBird, и не пробовал такое пока. Может пофиксили уже...
← →
sndanil (2002-10-05 17:21) [2]в том то и дело, что и база то не большая... правда FireBird еще не пробовал...
← →
Prooksius (2002-10-05 17:25) [3]А зачем тебе так часто коммит делать? Что за специфика работы?
← →
sndanil (2002-10-05 17:29) [4]да на самом деле не часто... просто алес в таком случае наступает в конце рабочаго дня... сам понимаешь неприятное дело... я вообще-то хотел еще и из другой транзакции запросы делать (из другой проги) по результатам работы первой... вот собственно и все...
← →
Prooksius (2002-10-05 17:34) [5]Не знаю, как ты спроектировал твое приложение, но я поставил на все select-ы 1 транзакцию, открыл ее в начале работы и закрыл при выходе из проги.
На Updates я завел другую транзакцию, стартую, делаю дело и commit. Все.
Ну updates происходят не так уж часто, никогда не было зависа по этой причине.
А ты как делаешь?
← →
sndanil (2002-10-05 17:41) [6]беда в том, что мне в основном приходится делать update (практически ежесекундно), а select идет как следствие (т.к. надо выводить результат пользователю)... и по началу хотел сделать точно как ты описал, но при таком подходе приходилось commit делать еще чаще... так что пришлось часть select"ов пересадить в одну транзакцию с update"ами...
← →
Prooksius (2002-10-05 17:48) [7]Да, если updates ежесекунждно... Странная работа. Как это юзер так быстро что-то вводит/меняет ;-)
Ну делай commit после 10-20 изменений, например.
Если ничего не поможет, попробуй поставить счетчик на commit-ы и после каждых 10000 disconnect-ится от базы. Ну, как я описывал.
← →
sndanil (2002-10-05 17:56) [8]дык ясное дело что не успевает он :-)... ему еще прога помогает :-)... я же тебе говорю, что сейчас довел до того, что commit"ы происходят не более 1000 за день... и все равно такая лажа... даже интересно, что он там так усердно делает, что как ты гриш если отсоединиться (это кстати и я пока использую в качестве борьбы), то все будет нормально...
← →
Prooksius (2002-10-07 13:47) [9]Народ, мастера!
Что ни у кого такого трабла не было?
← →
kaif (2002-10-07 17:08) [10]Почитай про многоверсионный механизм IB. Дело в том, что если иногда не делать корпоративную чистку (SELECT COUNT(*) FROM...), старые версии записей накапливаются в базе, и, несмотря на Commit, никуда не деваются. Возможно, на это отвлекаются не только страницы базы, но и ресурсы процессорного времени тоже...
Еще, может быть имеет смысл явно стартовать транзакции после Commit, а не полагаться на неявную транзакцию, происходящую при, например, TIBQuery.Open.
Если найдется решение проблемы, сообщи. Это, я думаю, многим будет интересно...
← →
Prooksius (2002-10-07 17:33) [11]Дело в том, что я делал перенос инфы с *.txt в базу. Только текст + текстовый блоб (небольшой). Пользовался FIBPlus.
Данные только вводились (Insert). Использовал Query
Query.SQL := "insert into [table](...) values(...)"
Вот примерно код:
pFIBTransaction.StartTransaction;
Все очень просто!
pFIBQuery.ParamByName("Param1").AsString := <SomeValue1>;
...
pFIBQuery.ParamByName("ParamN").AsString := <SomeValueN>;
pFIBQuery.ExecQuery;
pFIBTransaction.Commit;
После ~10000 Commit-ов комп начинал жутко тормозить (постоянное обращение к винту) и в конце концов вешался.
Никакого появления версий не должно было быть.
← →
3JIA9I CyKA (2002-10-07 17:43) [12]Sweep interval поменяй.
← →
Prooksius (2002-10-07 18:06) [13]Почитал у Дмитрия Кузменко на сайте www.ibase.ru:
http://www.ibase.ru/devinfo/ibfaq.htm
...если вы вставите в таблицу 1000000 (миллион) записей, завершая вставку каждой операцией commit, то автоматический sweep запущен не будет (OAT-OIT постоянно и очень мало). Однако так поступать тоже не стоит, т.к. вставка будет происходить очень медленно - лучше всего в одной транзакции вставлять 100-200 записей.
Так и делал!
Записей было примерно 80 000. Коммиты пробовал через 100 - 1000. И все равно зависало.
2 3JIA9I CyKA © (07.10.02 17:43)
Поэтому Sweep Interval не поможет - его (свипа) вообще не будет.
← →
Prooksius (2002-10-08 23:11) [14]Я выкупил, почему у меня (по крайней мере) зависал комп.
Я использовал CommitRetaining вместо Commit!
Сейчас попробовал Commit - все в норме и после 400000 строк! Retaining - виснет через 10000 строк!
У кого какие будут комментарии, мастера?
2 sndanil © (05.10.02 17:56)
Если ты используешь CommitRetaining - попробуй обойтись Commit-ом. Если не поможет - IB тут не причем. :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c