Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-92477
Magic
2002-10-17 13:19
2002.10.28
Типы потомки от стандартных


14-92682
^Sanya
2002-09-05 14:57
2002.10.28
---|Ветка была без названия|---


14-92727
KPY
2002-10-09 08:26
2002.10.28
Хай хто в фотошопе шарит?


3-92377
Cossys
2002-10-04 17:37
2002.10.28
Динамически добавлять поле к запросу


1-92534
zsv
2002-10-16 09:14
2002.10.28
Не могу изменить значение параметра в реестре!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский