Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с производительностью в Interbase [D6, IB6.x]


sndanil ©   (2002-10-05 16:33:00) 

Проблема в том, что чем больше выполнтяь оперций Commit для транзакции тем большую нагрузку испытывает сервер... так например если выполнять Commit хотябы раз в две секунды, то через час или два Athlon 850 становится загруженным на 100% и напрягает его в основном ibserver. В рамках тарнзакции производятся операции update, insert, delete, select (join)... соответственно если не выполнять Commit то все работает хорошо и компутер не напрягается более чем на 10% ..... если кто знает как с этим бороться прошу помочь... заранее благодарен.


Prooksius   (2002-10-08 23:11:00) [1]

Я выкупил, почему у меня (по крайней мере) зависал комп.
Я использовал CommitRetaining вместо Commit!
Сейчас попробовал Commit - все в норме и после 400000 строк! Retaining - виснет через 10000 строк!
У кого какие будут комментарии, мастера?

2 sndanil © (05.10.02 17:56)
Если ты используешь CommitRetaining - попробуй обойтись Commit-ом. Если не поможет - IB тут не причем. :)


Prooksius   (2002-10-07 18:06:00) [2]

Почитал у Дмитрия Кузменко на сайте 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 не поможет - его (свипа) вообще не будет.


3JIA9I CyKA   (2002-10-07 17:43:00) [3]

Sweep interval поменяй.


Prooksius   (2002-10-07 17:33:00) [4]

Дело в том, что я делал перенос инфы с *.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-ов комп начинал жутко тормозить (постоянное обращение к винту) и в конце концов вешался.
Никакого появления версий не должно было быть.


kaif   (2002-10-07 17:08:00) [5]

Почитай про многоверсионный механизм IB. Дело в том, что если иногда не делать корпоративную чистку (SELECT COUNT(*) FROM...), старые версии записей накапливаются в базе, и, несмотря на Commit, никуда не деваются. Возможно, на это отвлекаются не только страницы базы, но и ресурсы процессорного времени тоже...
Еще, может быть имеет смысл явно стартовать транзакции после Commit, а не полагаться на неявную транзакцию, происходящую при, например, TIBQuery.Open.
Если найдется решение проблемы, сообщи. Это, я думаю, многим будет интересно...


Prooksius   (2002-10-07 13:47:00) [6]

Народ, мастера!
Что ни у кого такого трабла не было?


sndanil   (2002-10-05 17:56:00) [7]

дык ясное дело что не успевает он :-)... ему еще прога помогает :-)... я же тебе говорю, что сейчас довел до того, что commit"ы происходят не более 1000 за день... и все равно такая лажа... даже интересно, что он там так усердно делает, что как ты гриш если отсоединиться (это кстати и я пока использую в качестве борьбы), то все будет нормально...


Prooksius   (2002-10-05 17:48:00) [8]

Да, если updates ежесекунждно... Странная работа. Как это юзер так быстро что-то вводит/меняет ;-)
Ну делай commit после 10-20 изменений, например.
Если ничего не поможет, попробуй поставить счетчик на commit-ы и после каждых 10000 disconnect-ится от базы. Ну, как я описывал.


sndanil   (2002-10-05 17:41:00) [9]

беда в том, что мне в основном приходится делать update (практически ежесекундно), а select идет как следствие (т.к. надо выводить результат пользователю)... и по началу хотел сделать точно как ты описал, но при таком подходе приходилось commit делать еще чаще... так что пришлось часть select"ов пересадить в одну транзакцию с update"ами...


Prooksius   (2002-10-05 17:34:00) [10]

Не знаю, как ты спроектировал твое приложение, но я поставил на все select-ы 1 транзакцию, открыл ее в начале работы и закрыл при выходе из проги.
На Updates я завел другую транзакцию, стартую, делаю дело и commit. Все.
Ну updates происходят не так уж часто, никогда не было зависа по этой причине.
А ты как делаешь?


sndanil   (2002-10-05 17:29:00) [11]

да на самом деле не часто... просто алес в таком случае наступает в конце рабочаго дня... сам понимаешь неприятное дело... я вообще-то хотел еще и из другой транзакции запросы делать (из другой проги) по результатам работы первой... вот собственно и все...


Prooksius   (2002-10-05 17:25:00) [12]

А зачем тебе так часто коммит делать? Что за специфика работы?


sndanil   (2002-10-05 17:21:00) [13]

в том то и дело, что и база то не большая... правда FireBird еще не пробовал...


Prooksius   (2002-10-05 17:15:00) [14]

Да, и у меня был такой глюк. Как-то переносил мег 20 инфы из *,txt в базу и натыкался на зависон компа.
Долго долбался - так и не понял чего это... :-/
Вылечилось так: после 10000 коммитов делал disconnect от базы, потом снова коннектился и продолжал дальше.
Я пробовал это на IB 5.6, сейчас на FireBird, и не пробовал такое пока. Может пофиксили уже...


Наверх

Титульная страница Поиск, карта сайта Написать письмо