| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Firebird, Interbase > Быстродействие InterBase |
| Автор: Arnold Lane 14.6.2005, 20:02 |
| Я только-только начал переходить с BDE на InterBase, вернее на FireBird. Так вот, в реальном проекте у меня происходит следующее, таблица содержащая некие данные при определенных условиях, очищается и вновь заполняется схожими , но обновленными данными, из текстового файла. При работе с BDE, заполнение происходит приблизительно за пол-минуты. Использую при этом стандартный набор, TTable с закладки BDE и методы Insert и Post. Перевожу проект на использование InterBase. Эффект очень интересный, то же самое обновление таблицы происходит на порядок медленее, минут за пять. И это при том что машина у меня далеко не слабая. При этом использую стандартные компоненты с закладки InterBase - TIBDataBase, TIBTransaction, TIBDataSet. Из вводных остается наверное добавить, использую сервер FireBird 1.5 SuperServer, и клиент и сервер расположены на одной машине. Теперь собственно суть. Я понимаю, что технологии InterBase расчитаны на многопользовательский режим и на работу с удаленными базами. И все же, неужели при однопользовательском режиме и локальном расположении базы такое снижение быстродействия по сравнению с BDE? Или я чего-то недопонимаю, и не так делаю? |
| Автор: SPrograMMer 14.6.2005, 20:13 | ||||
угу + TIBQuery а вот
|
| Автор: Alex 14.6.2005, 21:45 |
| Все зависит, от того, что за таблицу вы обновляете. При большом обновлении лучше отключить индексы, что бы они не пересчитывались при добавлении каждой новой записи, а после обновления опять включить индексы. Каждая ситуация требует индивидуального подхода FireBird это не dbf и возможности у него не сравнимо больше, но нужно знать, что и когда применять. И еще советую перейти на FIBPlus |
| Автор: Arnold Lane 14.6.2005, 23:29 |
| To SPrograMMer - использование компонента TIBDataSet вместо привычных TIBTable и TIBQuery, советуют авторы книги Мир InterBase. Настойчиво советуют. И я вынужден с ними согласиться. Во-первых это как-то изящней что ли, во-вторых, касательно именно моей проблемы, никакой разницы в работе этих компонентов. To Alex - 1. Никаких индексов в этой таблице вообще не существует. 2. Количество обновляемых записей приблизительно равно 10 тысячам. 3. Завтра попробую использовать компоненты FIBPlus. Правда не покидает плохое предчувствие, что сильно делу они не помогут. В любом случае не оставляет чувство , что я где-то не "выключил утюг". Ну не может быть такой разницы. BDE - 30 сек., FireBird - 5 мин. Какие бы различия в архитектуре бы не были. |
| Автор: Alex 15.6.2005, 08:49 |
| А можно код посмотреть? |
| Автор: Alex 15.6.2005, 09:51 |
| Вот пример добавления 10000 записей при этом на моей машине этот код выполняется чуть больше 5 секунд |
| Автор: ArnoldLane 21.6.2005, 00:35 |
| To Alex Действительно используя TIBQuery добился более или менее приличного быстродействия. Но остается одно "но". При использовании TIBDataSet (на чем настаивают авторы "Мир interBase") и TIBTable, бысродействие, или пожалуй правильней сказать, медленодействие шокирующее. Хотя логика здравого смысла и тот небольшой багаж знаний, который я имею, позволяли до сего момента считать, что при операции вставки записей в таблицу разница в эффективности между SQL-запросом и прямым доступом минимальна. А c TIBDataSet вообще бредятина какая-то получается, по сути дело при выполнения метода TIBDataSet->Insert(), происходит выполнения SQL-запроса, полностью аналогичному запросу компонента TIBQuery. Но факт остается фактом - TIBDataSet и TIBTable в разы медленее TQuery. P.S. Код я постараюсь вскоре показать. Просто дело в том, что проект реальный и очень большой, необходимо вычленить код непосредственно касаемый данной темы. А на это необходимо время, а со временем пока ужасный "Zeit not". Вот и сумничал. |
| Автор: Alex 21.6.2005, 02:47 |
| ArnoldLane, Несмотря на то, что я очень уважаю авторов книги, но этот их совет у меня уже в печенках сидит. Реализация этого компонента оставляет желать лучшего. Его медлительность лично я объясняю для себя тем, что они работают через параметры, а на преобразование данных и другие манипуляции с параметрами требуется время. Но те задержки, о которых вы говорите это просто не реальные цифры создается впечатление, что у вас не оптимизирован сам алгоритм подготовки данных для заполнения. |
| Автор: AZDesign 24.6.2005, 09:57 |
| 1) удалять 10000 записей и потом добавлять их снова - это значить не понимать SQL 2) в твоем примере происходит следующее : а) установить соединение б) добавить ОДНУ!!!!! запись в) закрыть соединение г) Начасть все сначала для большего удивления можно после каждого оператора поставить задержку на пару дней. 3) у Димы Кузьменко на сайте http://www.ibase.ru есть статья как поднять быстродействие за счет HDD. Т.е. для быстрой работы нужно иметь ТРИ HDD и клиент должен быть на отдельном компьютере Мне удалось проверить его рекоментации, правда вставка записей была через isql.exe - быстродействие увеличилось в 6 раз по сравнению с расположением всех файлов на 1 винчестере В тесте выполнялась вставка 600000 записей, при этом для каждой записи предварительно выполнялось 4 запроса и внутри триггера Insert еще 4 запроса и некоторая вычислительная работа. На все ушло 14 часов. Для простых вставок как у тебя быстродействие увеличивается еще больше. |
| Автор: Alex 24.6.2005, 16:38 | ||
Это вы про какой пример? |
| Автор: AZDesign 24.6.2005, 17:01 | ||
А тот который TestFB.rar
Или я это сам придумал |
| Автор: Alex 24.6.2005, 22:21 |
| AZDesign, и где я добавляю одну запись и закрываю соединение? Если вы все же посмотрите код, то увидите, что commit я делаю, только после добавления всех записей |
| Автор: Владимр 15.9.2005, 02:18 |
| Для массовой заливке надо использовать IBSQL или его аналоги, не связанные со средствами визуализации. Всю вставку в 1 транзакции. Вчера мерял - вставка 1м записей 115 секунд.Компоненты IBX 850MHz,128MB/ |