Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата
компоненты с закладки InterBase - TIBDataBase, TIBTransaction,

угу + TIBQuery
а вот
Цитата
TIBDataSet
чета-ниочень....

Автор: 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, 10:57)
в твоем примере происходит следующее :

Это вы про какой пример?

Автор: AZDesign 24.6.2005, 17:01
А тот который TestFB.rar
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  n, k: Integer;
  s: String;
begin
  IBDatabase1.Open;
  IBTransaction1.StartTransaction;
  try
    for n:= 1 to 10000 do begin
      s:= 'INSERT INTO NEW_TABLE VALUES(' + IntToStr(n);
      for k:= 1 to 9 do begin
        s:= Format('%s,%s', [s, QuotedStr(StringOfChar('F', 20))]);
      end;
      s:= s + ')';
      IBQuery1.Close;
      IBQuery1.SQL.Text:= s;
      IBQuery1.ExecSQL;
    end;
    IBTransaction1.Commit;
    ShowMessage('Ok');
  except
    IBTransaction1.Rollback;
  end;
end;


Или я это сам придумал

Автор: Alex 24.6.2005, 22:21
AZDesign, и где я добавляю одну запись и закрываю соединение? Если вы все же посмотрите код, то увидите, что commit я делаю, только после добавления всех записей

Автор: Владимр 15.9.2005, 02:18
Для массовой заливке надо использовать IBSQL или его аналоги, не связанные со средствами визуализации.
Всю вставку в 1 транзакции. Вчера мерял - вставка 1м записей 115 секунд.Компоненты IBX
850MHz,128MB/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)