Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.07;
Скачать: CL | DM;

Вниз

Импорт из 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.021 c
2-1189192064
Dmitriy_
2007-09-07 23:07
2007.10.07
Прозрачная форма, но в фокусе?


15-1189158558
Сергей2006
2007-09-07 13:49
2007.10.07
unable to locate hyperlink в Help Insight


11-1173115116
Dy1
2007-03-05 20:18
2007.10.07
Как создавать Edit ?


2-1189490393
Washington
2007-09-11 09:59
2007.10.07
Форма поверх окон


3-1180925040
Slider007
2007-06-04 06:44
2007.10.07
Даты в хранимых процедурах (FireBird 1.5)