Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

Импорт из *.dbf в FireBird   Найти похожие ветки 

 
MZ   (2007-05-16 14:52) [0]

Может кто подскажет... Нужно сделать импорт из dbf таблицы в FireBird. Пользуюсь FIBPlus. Делаю так: С помощью BDE связаваюсь с исходными таблицами и тупо присваиваю значения - FIBDataSet1.FN("Принимающее поле").asString:=Query1.FieldByName("Исходное поле").AsString
Но работает медленно. Может есть более оптимальный способ это сделать...


 
Jan1   (2007-05-16 14:53) [1]

есть, не коммитить каждую запись, а допустим - 1000-ную.


 
Sergey13 ©   (2007-05-16 14:54) [2]

> [0] MZ   (16.05.07 14:52)

В БДЕ возможны гетерогенные запросы.
Есть еще DataPump в поставке делфей.


 
MZ   (2007-05-16 14:59) [3]


> Есть еще DataPump в поставке делфей.
>

Дело в том, что это должен делать пользователь, все умственные возможности которого сводяться тока к нажатию кнопки "Импорт"


 
DelphiLexx ©   (2007-05-16 15:01) [4]

Лучше используй TDBF версии 6.9 или выше и BDE нафиг не нужен и скорость быстрей + использую, то что посоветовал Jan1


 
MZ   (2007-05-16 15:03) [5]


> Лучше используй TDBF версии 6.9 или выше и BDE нафиг не
> нужен и скорость быстрей + использую, то что посоветовал
> Jan1
>

А что это такое, с чем его едят и где взять?


 
DelphiLexx ©   (2007-05-16 15:09) [6]


> А что это такое, с чем его едят и где взять?

TDBF компонент по работе с DBF прост в использовании, бесплатен.
Насчет где взять, то здесь http://up.spbland.ru/files/070516110/
(я сегодня добрый).


 
DelphiLexx ©   (2007-05-16 15:13) [7]

DBF небось из 1C


 
MZ   (2007-05-16 15:15) [8]


> TDBF компонент по работе с DBF прост в использовании, бесплатен.
>
> Насчет где взять, то здесь http://up.spbland.ru/files/070516110/
> (я сегодня добрый).
>

Спасибо, попробую...


 
MZ   (2007-05-16 15:25) [9]

Еще такой вопрос.  Значения я присваиваю в цикле, и у меня возникла такая проблема - если в исходной таблице нет значения, то FIBDataSet оставляет предидущее значение поля, боролся так
if Query1.Fields[5].IsNull then  FIBDataSet.FN("Принимающее поле").AsString:=" - "
    else  FIBDataSet.FN("Принимающееполе").AsString:=Query1.Fields[5].AsString; Q

Не помогает. Подскажите как быть


 
Jan1   (2007-05-16 15:32) [10]


> Подскажите как быть

пропускать


 
Loginov Dmitry ©   (2007-05-16 15:33) [11]

> Лучше используй TDBF версии 6.9 или выше и BDE нафиг не
> нужен и скорость быстрей + использую, то что посоветовал
> Jan1


DBF здесь непричем. Скорость падает при добавлении записей в табличку FireBird. Чтоб скорость не падала, имхо, следует использовать запросы с параметрами.


 
MZ   (2007-05-16 15:35) [12]


> пропускать
>

Как это пропускать? Наскока я понял уменя не работает if Query1.Fields[5].IsNull
так как же мне узнать какую запись пропускать?


 
Loginov Dmitry ©   (2007-05-16 15:37) [13]

> Еще такой вопрос.  Значения я присваиваю в цикле, и у меня
> возникла такая проблема - если в исходной таблице нет значения,
> то FIBDataSet оставляет предидущее значение поля, боролся
> так
> if Query1.Fields[5].IsNull then  FIBDataSet.FN("Принимающее
> поле").AsString:=" - "
>    else  FIBDataSet.FN("Принимающееполе").AsString:=Query1.Fields[5].AsS
> tring; Q
> Не помогает. Подскажите как быть


Так попробуй:
 if not Query1.Fieds[5].IsNull then
   FIBDataSet.FN("Принимающееполе").Assign(Query1.Fieds[5]);


 
Jan1   (2007-05-16 15:48) [14]


> Чтоб скорость не падала, имхо, следует использовать запросы
> с параметрами.

а ты думаешь FIBPlus их как-то обходит? :)


 
Jan1   (2007-05-16 15:50) [15]


> так как же мне узнать какую запись пропускать?

почему запись? поле. пропускать его заполнение, оно ляжет в базу null. или используй у полей свойство Value, для БЛОБа юзай Assign.


 
MZ   (2007-05-16 15:54) [16]

Точно... Не выполнялось условие if Query1.Fieds[5].IsNull
сделал if (Query1.Fieds[5].IsNull) or (Query1.Fieds[5].asString="") then ... -так работает


 
ANB ©   (2007-05-16 16:41) [17]


> а ты думаешь FIBPlus их как-то обходит? :)

Я вот думаю, что инсерт навигационными методами несколько помедленнее прямого скл инсерта. Особливо если запрос с параметрами и его заранее препарировать. ИМХО - качалки типа DataPump фактически так и делают.
Кстати, по опыту, играние коммитами дает мало выигрыша. В оракле прирост скорости - несколько процентов, зато имеем геморрой с обработкой процесса.


 
Jan1   (2007-05-16 16:45) [18]


> Я вот думаю, что инсерт навигационными методами несколько
> помедленнее прямого скл инсерта. Особливо если запрос с
> параметрами и его заранее препарировать.

зачему тут чего-то думать, просто надо глянуть внутрености плюсов.


> Кстати, по опыту, играние коммитами дает мало выигрыша.
> В оракле прирост скорости - несколько процентов, зато имеем
> геморрой с обработкой процесса.

может это у Оракла, а у МС и ФБ это дает существенны прирост.


 
Loginov Dmitry ©   (2007-05-16 16:50) [19]

При использовании TpFIBQuery скорость инсертов реально увеличивается, причем как минимум в 3 раза. А вот эффекта от Prepared че-то незаметно.


 
ANB ©   (2007-05-16 17:24) [20]


> а у МС

У МС - вообще эффекта практически нету. Специально засекал при конвертации.


 
Jan1   (2007-05-16 17:40) [21]


> У МС - вообще эффекта практически нету. Специально засекал
> при конвертации.

как засекал?


 
ANB ©   (2007-05-16 18:53) [22]


> как засекал?

Часами. С коммитом на каждую запись перекачка шла двое суток и на каждую 1000 - примерно столько же. Только еще грабли с ошибками собирать пришлось. В конце концов плюнул, поставил коммит на каждую запись (точнее выкинул старт транзакции и все с ним связанное), выбирая надежность минимальному приросту скорости.


 
Jan1   (2007-05-16 19:08) [23]


> С коммитом на каждую запись перекачка шла двое суток и на
> каждую 1000 - примерно столько же.

Проверь:

use Northwind
go

SET ARITHABORT off
go

create table a ( id int, flag int )
GO

set nocount on

declare @i int, @t datetime

select @i = 0, @t = getdate()

while @i < 1000 begin
insert into a (id, flag ) select @i, @i
select @i = @i + 1
end

select 1000.0 / ((1.0*datediff( ms, @t, getdate())) / 1000.0)
GO

drop table a
GO

create table a ( id int, flag int )
GO

set nocount on

declare @i int, @t datetime

select @i = 0, @t = getdate()

begin tran
while @i < 1000 begin
insert into a (id, flag ) select @i, @i
select @i = @i + 1
end
commit

select 1000.0 / ((1.0*datediff( ms, @t, getdate())) / 1000.0)
GO

drop table a
GO

результат:
-----------------------------------
2463.0541871921182266009852

-----------------------------------
30303.0303030303030303030303


 
Jan1   (2007-05-16 19:12) [24]

пример, не мой.


 
Jan1   (2007-05-16 19:22) [25]

в принципе нагляднее будет строку
select 1000.0 / ((1.0*datediff( ms, @t, getdate())) / 1000.0)
на
select datediff( ms, @t, getdate())


 
ANB ©   (2007-05-17 12:25) [26]


> Jan1   (16.05.07 19:22) [25]

Хех. Для инсерта в хранимке на чистую таблицу это может и существенно.
Однако в условиях :
1. Каждый инсерт приезжает по одному с клиента
2. Кроме как в мс скл нужно синхронно писать еще и лог в оракл (обрабатывая при этом ошибки, чтобы процесс не прерывался)
3. Достав очередную запись из оракла попрыгать вокруг с нее с бубном, т.к. в исходном виде она укладываться не хочет (минимум - заменить ID и ссылки)
4. На таблицу навешены куча индексов и триггеров и срубать их нельзя
5. Перед вставкой записи нужно убедиться, что такой еще нету (причем на констрейнты полагаться нельзя, т.к. проверка заумная)

вот в таких условиях выигрыш на коммитах практически незаметен :)


 
Mike Kouzmine ©   (2007-05-18 20:29) [27]

В 6 дельфи был комплонент в бде назывался TDataPump ввроде. Там можно настраивать - добавлять, заново и т.д. Какие поля куда. Куда девать записи не вставленные по любым причинам... Для копирования удобен, но требует БДЕ


 
kaif ©   (2007-05-18 22:54) [28]

Я недавно делал импорт 1.5 млн записей в Firebird 1.5.
Один старт вначале и один коммит в конце. Изначально таблица пустая. Никакого видимого замедления при добавлении новых записей в процессе импорта не наблюдалось. (Каждые 100 записей обновляю ProgressBar). Весь импорт занимает около часа. Для соединения с DBF использовал OLE DB Provider for Microsoft Visual FoxPro.

А вообще я как правило всегда сталкивался с постепенным ощутимым замедлением при вставке. Раньше я всегда применял COMMIT на каждые 100 записей. Впервые (причем совершенно случайно!) попробовал один общий коммит на полтора миллиона. Все отлично. Возможно проблема возникала  обычно из-за сочетания частого коммита с ForcedWrites.
Хотя точно сказать не могу - так как этот импорт заработал, уже сильно вникать не стал.
:)
Но предлагаю попробовать общий коммит на весь импорт.
Если замедление исчезнет, то почему бы нет?
:)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.045 c
6-1169375208
Jeeb
2007-01-21 13:26
2007.09.16
HTTP/1.1 HTTP/1.0 разница?


15-1187433979
GhosTer
2007-08-18 14:46
2007.09.16
Где взять?


15-1187317251
Идей
2007-08-17 06:20
2007.09.16
Можно ли написать функцию которая бы писала функцию копирования з


15-1187613383
pasha_golub
2007-08-20 16:36
2007.09.16
SYN flood: как побороть?


15-1185524008
AZIZE
2007-07-27 12:13
2007.09.16
Вешаюсь в голову ничего не лезет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский