![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Импорт из DBF в FireBird [D7, FireBird 2.0]
MZ © (2007-05-31 09:46:00)Делаю импорт из Dbf в FireBird. Один Commit на весь импорт. Записей примерно 100000. Так вот импорт существенно замедляется... Первые 10000 записей импортируются примерно за 1 минуту, а последние около 20 мин. Как с этим бороться?
MZ (2007-05-31 11:49:00) [1]
> > Через InsertSQL? А в качестве параметров передовать значения
> > полей qDBFQuery? Это быстрее?
>
> не поверишь, да :)
Огромное спасибо.... Через InsertSQl с параметрми 100000 записей влетели за 2 минуты....
Jan1 (2007-05-31 11:02:00) [2]
> Через InsertSQL? А в качестве параметров передовать значения
> полей qDBFQuery? Это быстрее?
не поверишь, да :)
А ты вообще читаешь документацию по том что юзаешь?
Quick Data Operations
* Direct SQL statements execution with the help of TpFIBQuery.
* Packet record processing in the TpFIBQuery.BatchInput, TpFIBQuery.BatchOutput methods.
* Fast and efficient non-buffered select of records in TpFIBQuery.
* Direct execution of stored procedures by TpFIBQuery.ExecProcedure method.
* Convenient processing of BLOB-fields.
Sergey13 (2007-05-31 11:00:00) [3]> [20] MZ (31.05.07 10:39)
напиши запрос (отдельный кверик TIBQuery или TIBSQL или их аналоги из фибов)
insert into dest_table(перечень полей) values(перечень параметров)
В цикле присваивай параметрам значения из DBF и выполняй. При этом можно играться с коммитом через разные промежутки записей.
MZ (2007-05-31 10:56:00) [4]
> Не пытайся для больших объемов работать на делфи с таблицей
> позиционным способом.
Так каким образом делать импорт?
> SQL надо учить.
Подскажи
ANB (2007-05-31 10:50:00) [5]
> MZ (31.05.07 10:46) [23]
Не пытайся для больших объемов работать на делфи с таблицей позиционным способом.
Да и вообще, позиционный способ подходит только для редактирования юзером, чтобы он без полного рефреша видел свои изменения (если работает с гридом).
SQL надо учить.
MZ (2007-05-31 10:46:00) [6]
> Да это вообще уже пофигу. Самая порочная практика - работать
> с SQL сервером, как с DBF.
>
Если можно поясни....
ANB (2007-05-31 10:44:00) [7]
> MZ (31.05.07 10:39) [20]
И причем тут InsertSQL . . . .
ANB (2007-05-31 10:43:00) [8]
> > dataSet.FN('Принимающее поле1').asString:=qDBFQuery.Fields[1].
>
> > asStreing;
Да это вообще уже пофигу. Самая порочная практика - работать с SQL сервером, как с DBF.
MZ (2007-05-31 10:39:00) [9]
> Что бы положить деньги в кошелек не нужно пересчитывать
> в нем наличность.
> Зачем ты пишешь в отурытый датасет? Пиши напрямую в базу
> запросом.
>
Через InsertSQL? А в качестве параметров передовать значения полей qDBFQuery? Это быстрее?
Jan1 (2007-05-31 10:37:00) [10]
> dataSet.FN('Принимающее поле1').asString:=qDBFQuery.Fields[1].
> asStreing;
в огороде бузина а в Киеве дядько...
в одном месте по индексу, в другом через метод...
Jan1 (2007-05-31 10:35:00) [11]
> Пользуюсь FIBPlus
ну там должен быть компанент аналогичный IBSQL
MZ (2007-05-31 10:34:00) [12]
> почему Dataset а не IBSQL?
>
Пользуюсь FIBPlus
Sergey13 (2007-05-31 10:34:00) [13]> [13] MZ (31.05.07 10:32)
Что бы положить деньги в кошелек не нужно пересчитывать в нем наличность.
Зачем ты пишешь в отурытый датасет? Пиши напрямую в базу запросом.
Jan1 (2007-05-31 10:33:00) [14]+ параметры.
Jan1 (2007-05-31 10:33:00) [15]
> DataSet
почему Dataset а не IBSQL?
MZ (2007-05-31 10:32:00) [16]
>
> какой код?
>
try
Tr.SrartTransaction;
while not qDBFQuery.eof do
begin
DataSet.Insert;
dataSet.FN('Принимающее поле1').asString:=qDBFQuery.Fields[1].asStreing;
dataSet.FN('Принимающее поле2').asString:=qDBFQuery.Fields[2].asStreing;
...........................................
DataSet.Post;
If (qDBFQuery.RecNo mod 1000)=0 then
if Tr.Active then
begin
Tr.Commit;
Tr.StartTransaction;
end;
end;
Tr.Commit;
except
Tr.RollBack;
end;
Что-то типо того
Jan1 (2007-05-31 10:23:00) [17]
> Делаю импорт из Dbf в FireBird.
какой код?
MZ (2007-05-31 10:21:00) [18]
>
> > Поле Varchar(9
>
> А ты часом не проверяешь по этому полю, что запись была
> уже добавлена ?
>
Нет
ANB (2007-05-31 10:18:00) [19]
> Поле Varchar(9
А ты часом не проверяешь по этому полю, что запись была уже добавлена ?
Jan1 (2007-05-31 10:16:00) [20]
> if (DataSet.RecNo mod 1000)=0 then Tr.Commit
а как по другому? ну разве что еще счетчик свой завести... Ну и не забыть после цикла проверить что активна транзакция и закоммитить ее...