Форум: "Базы";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
ВнизИмпорт из DBF в FireBird Найти похожие ветки
← →
MZ (2007-05-31 09:46) [0]Делаю импорт из Dbf в FireBird. Один Commit на весь импорт. Записей примерно 100000. Так вот импорт существенно замедляется... Первые 10000 записей импортируются примерно за 1 минуту, а последние около 20 мин. Как с этим бороться?
← →
Тулещ (2007-05-31 09:49) [1]На таблице, в которую импорт делаешь, триггеры/индексы не навешены?
← →
MZ (2007-05-31 09:51) [2]
> На таблице, в которую импорт делаешь, триггеры/индексы не
> навешены?
> <Цитата>
>
>
триггеров нет, а индекс один-по ключевому полю..
← →
Сергей М. © (2007-05-31 09:54) [3]
> индекс один-по ключевому полю
Что оно из себя представляет ?
← →
Sergey13 © (2007-05-31 09:54) [4]> [0] MZ (31.05.07 09:46)
> Один Commit на весь импорт.
Ну так поэкспериментируй с этим.
← →
Тулещ (2007-05-31 09:55) [5]Могу только предположить - раз открыта транзакция, информация, необходимая для ее возможного отката, где-то же хранится, и ее объем растет пропорционально кол-ву незакоммиченных изменений. Т.е. может лучше импортировать более мелкими порциями?
← →
MZ (2007-05-31 09:57) [6]
> > индекс один-по ключевому полю
>
>
> Что оно из себя представляет ?
>
Поле Varchar(9)
← →
Сергей М. © (2007-05-31 10:03) [7]
> MZ (31.05.07 09:57) [6]
Что мешает на время импорта удалить индекс и воссоздать его после завершения импорта ?
← →
MZ (2007-05-31 10:03) [8]
> Могу только предположить - раз открыта транзакция, информация,
> необходимая для ее возможного отката, где-то же хранится,
> и ее объем растет пропорционально кол-ву незакоммиченных
> изменений. Т.е. может лучше импортировать более мелкими
> порциями?
>
Я тоже так подумал, Но к своему стыду не могу продумать алгоритм выбора , например каждой тысячной записи, что-то типа if (DataSet.RecNo mod 1000)=0 then Tr.Commit
← →
Jan1 © (2007-05-31 10:16) [9]
> if (DataSet.RecNo mod 1000)=0 then Tr.Commit
а как по другому? ну разве что еще счетчик свой завести... Ну и не забыть после цикла проверить что активна транзакция и закоммитить ее...
← →
ANB © (2007-05-31 10:18) [10]
> Поле Varchar(9
А ты часом не проверяешь по этому полю, что запись была уже добавлена ?
← →
MZ (2007-05-31 10:21) [11]
>
> > Поле Varchar(9
>
> А ты часом не проверяешь по этому полю, что запись была
> уже добавлена ?
>
Нет
← →
Jan1 © (2007-05-31 10:23) [12]
> Делаю импорт из Dbf в FireBird.
какой код?
← →
MZ (2007-05-31 10:32) [13]
>
> какой код?
>
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:33) [14]
> DataSet
почему Dataset а не IBSQL?
← →
Jan1 © (2007-05-31 10:33) [15]+ параметры.
← →
Sergey13 © (2007-05-31 10:34) [16]> [13] MZ (31.05.07 10:32)
Что бы положить деньги в кошелек не нужно пересчитывать в нем наличность.
Зачем ты пишешь в отурытый датасет? Пиши напрямую в базу запросом.
← →
MZ (2007-05-31 10:34) [17]
> почему Dataset а не IBSQL?
>
Пользуюсь FIBPlus
← →
Jan1 © (2007-05-31 10:35) [18]
> Пользуюсь FIBPlus
ну там должен быть компанент аналогичный IBSQL
← →
Jan1 © (2007-05-31 10:37) [19]
> dataSet.FN("Принимающее поле1").asString:=qDBFQuery.Fields[1].
> asStreing;
в огороде бузина а в Киеве дядько...
в одном месте по индексу, в другом через метод...
← →
MZ (2007-05-31 10:39) [20]
> Что бы положить деньги в кошелек не нужно пересчитывать
> в нем наличность.
> Зачем ты пишешь в отурытый датасет? Пиши напрямую в базу
> запросом.
>
Через InsertSQL? А в качестве параметров передовать значения полей qDBFQuery? Это быстрее?
← →
ANB © (2007-05-31 10:43) [21]
> > dataSet.FN("Принимающее поле1").asString:=qDBFQuery.Fields[1].
>
> > asStreing;
Да это вообще уже пофигу. Самая порочная практика - работать с SQL сервером, как с DBF.
← →
ANB © (2007-05-31 10:44) [22]
> MZ (31.05.07 10:39) [20]
И причем тут InsertSQL . . . .
← →
MZ (2007-05-31 10:46) [23]
> Да это вообще уже пофигу. Самая порочная практика - работать
> с SQL сервером, как с DBF.
>
Если можно поясни....
← →
ANB © (2007-05-31 10:50) [24]
> MZ (31.05.07 10:46) [23]
Не пытайся для больших объемов работать на делфи с таблицей позиционным способом.
Да и вообще, позиционный способ подходит только для редактирования юзером, чтобы он без полного рефреша видел свои изменения (если работает с гридом).
SQL надо учить.
← →
MZ (2007-05-31 10:56) [25]
> Не пытайся для больших объемов работать на делфи с таблицей
> позиционным способом.
Так каким образом делать импорт?
> SQL надо учить.
Подскажи
← →
Sergey13 © (2007-05-31 11:00) [26]> [20] MZ (31.05.07 10:39)
напиши запрос (отдельный кверик TIBQuery или TIBSQL или их аналоги из фибов)
insert into dest_table(перечень полей) values(перечень параметров)
В цикле присваивай параметрам значения из DBF и выполняй. При этом можно играться с коммитом через разные промежутки записей.
← →
Jan1 (2007-05-31 11:02) [27]
> Через 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.
← →
MZ (2007-05-31 11:49) [28]
> > Через InsertSQL? А в качестве параметров передовать значения
> > полей qDBFQuery? Это быстрее?
>
> не поверишь, да :)
Огромное спасибо.... Через InsertSQl с параметрми 100000 записей влетели за 2 минуты....
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c