Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1189503688
DillerXX
2007-09-11 13:41
2007.10.07
Почему до сих пор не отменили запрет на выезд


2-1189515547
gimmi
2007-09-11 16:59
2007.10.07
Как скроллить TTreeView


2-1189192349
Tack
2007-09-07 23:12
2007.10.07
Выйти из программы после создания главной формы перед ее показом


2-1189180739
Black_Tomcat
2007-09-07 19:58
2007.10.07
Ошибка при удалении Edit.


2-1189424465
Mariya
2007-09-10 15:41
2007.10.07
Контексный поиск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский