Форум — Ответы     (  К темам )
 ?  1024byte: Как сделать много Insert'ов и один commit в InterBase ? (10-12-2002 13:40:29)
Надо занести в таблицу много результатов расчетов(1000 — 1500)
сейчас это делаеться так:

while(blah...blah..blah...){
....
IBSQL1->SQL->Text="Insert into blah...blah..blah...";
IBSQL1->ExecQuery();
}

и так 1000 раз

оч. медленно

а как бы сделать так чтобы можно было налабать все эти инсерты разом, а потом всех их закрммитить

типа:

while(blah...blah..blah...){
....
IBSQL1->SQL->Text+="Insert into blah...blah..blah...";
}
IBSQL1->ExecQuery();
 Павел (10-12-2002 20:44:56)
Вообще вставка в таблицу 1000-1500 записей и так дело не быстрое,
особенно если в таблице много полей, на вставку стоят какие-либо триггеры,
ограничения, зависит от размеров и типов полей и т.д.
Вопрос только насколько медленно — 1 сек ... 10 сек ... 1 мин ... 10 мин ... 1 час ???
Потом возникает вопрос — откуда вставлять, если из какой другой таблицы(таблиц)
то можно сразу Insert into ..... as select .... как запрос

Если вопрос о групповой операции (транзакции), или разрешить вставить все 1000-1500 записей или, если ошибка, то отменить вставку всех этих записей,
то можно воспользоваться компонентами FIBPlus, они работают с InterBase
(FireBird) без BDE, быстрее, и в них хорошо реализован механизм транзакций

DBase->Trans->StartTransaction();
//...вставка 1000-1500 записей
// если все нормально, то подтвердить вставку записей
DBase->Trans->Commit();

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

Если просто хотите снанчала сформировать весь текст запроса, а потои
его послать на выполнение, можете воспользоваться компонентом SQLScript
из библиотеки RXLib, но не уверен что получиться выигрыш в скорости

Опять надо смотреть, как рационально построена ваша база данных, например
насколько оптимально задан размер страницы базы данных, насколько оптимально
подобраны типы полей для хранения информации.

Так что напишите подробней, чем пользуетесь — какие компоненты используете для связи с InterBase, какие поля вставляете, и код, как вставляете.