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

Вниз

Что "лучше" использовать при выгрузке/загрузке данных из/в DBF   Найти похожие ветки 

 
Slaga ©   (2005-11-30 12:22) [0]

У меня есть задание выгрузить пару табличек из Оракла в ДБФ и у меня вопрос что лучше использовать ADO или BDE, "лучше" это в смысле практичнее, скорость выполнения выгрузки и т.д.

Я реализовал это, пока, через ADO, но 1000 при этом скорость вставки 1000 записей (5 полей, 4 - integer, 1 - string (ФИО)) приблизительно 10 секунд, всего записей в таблице 300000...

долго...

может подскажите как ускорить процесс


 
alex_*** ©   (2005-11-30 12:25) [1]

для ДБФ лучше пользовать компоненты прямого доступа. я пользовал TVKDBF


 
Sergey13 ©   (2005-11-30 12:28) [2]

Если интересно на http://oraclub.trecom.tomsk.su/ в утилитах есть готовые.


 
Vlad ©   (2005-11-30 12:35) [3]


> Slaga ©   (30.11.05 12:22)  


> что лучше использовать ADO или BDE

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


 
Slaga ©   (2005-11-30 12:47) [4]

Ну мне желательно без использования не стандартных компонент


 
slaga ©   (2005-11-30 12:49) [5]

Посоветуйте "правильный" алгоритм, а я поучусь, я использую такой:

with OutQuery do
 begin
  SQL.Add("CREATE TABLE "+Versions.DirName+" ("+Versions.FieldList+")");
  ExecSQL;
  OutQuery.SQL.Clear;
  Close;
  SQL.Add("INSERT INTO "+Versions.DirName+" ("+Versions.FieldListNotType+")    VALUES ("+Versions.ParamList+")");
  Parameters.ParseSQL(OutQuery.SQL.Text, true);
  Prepared;
 end;


while not OraDataSet.Eof do
 begin
  for i := 0 to OraDataSet.FieldCount - 1 do
   OutQuery.Parameters[i].Value := OraDataSet.Fields[i].Value;
  OutQuery.ExecSQL;
  OraDataSet.Next;
 end;


 
ANB ©   (2005-11-30 14:46) [6]


>  Prepared;

А чего эта строка делает ?
Имхо - быстрее уже не напишешь без особых изгалов. Есть смысл промониторить скорость выборки из оракла, если там сложный запрос.


 
ANB ©   (2005-11-30 14:47) [7]


> slaga ©   (30.11.05 12:49) [5]

Во. Сообразил. Закоментируй OutQuery.ExecSQL; и померяй время снова.


 
slaga ©   (2005-12-01 10:41) [8]

тормозит именно OutQuery.ExecSQL, выборка проходит относительно быстро, фетч тоже быстро, даже перебор полей не сильно тормозит, а вот OutQuery.ExecSQL ...

может можно как то пакетно это делать, ну например комитить после каждой 1000, но я не нашел как это сделать :(


 
ANB ©   (2005-12-01 10:46) [9]


> slaga ©   (01.12.05 10:41) [8]

DBF все равно транзакции напрямую не поддерживает, так что это - изгал, смысла нету. Можно попробовать писать в файл напрямую. У меня есть модуль (без вставок строк) и тут еще один коллега с  форума его доделывал - грит вставку сделал, но я еще не смотрел, как. Могу дать пока свой - сам дорисуешь.


 
Sergey13 ©   (2005-12-01 10:49) [10]

2[4] Slaga ©   (30.11.05 12:47)
>Ну мне желательно без использования не стандартных компонент
Если это был ответ мне на [2], то там не компоненты, а утилиты готовые.


 
Виталий Панасенко   (2005-12-01 11:21) [11]

А чем DataPump НЕ устраивает ? Уже ничего изобретать не нужно...


 
Vlad ©   (2005-12-01 11:40) [12]


> slaga ©   (01.12.05 10:41) [8]

а ты не пробовал использовать гетерогенные запросы?
Я правда не знаю возможности ADO в этом смысле, но в BDE это точно есть.
Т.е. возможно перекачать данные одним SQL запросом


 
slaga ©   (2005-12-01 12:28) [13]

Про "гетерогенные запросы" я не слышал ... надо почитать.

А что такое  "DataPump" ?


 
slaga ©   (2005-12-01 12:28) [14]

Про "гетерогенные запросы" я не слышал ... надо почитать.

А что такое  "DataPump" ?

to Sergey13 Ну готовые утилиты мне точно не подходят :)


 
ANB ©   (2005-12-01 14:41) [15]


> slaga ©   (01.12.05 12:28) [14]

Значится так. При работе с LocalSQL тормоза неизбежны :
1. Запрос нужно парсить
2. Выполнение идет через не сильно короткую цепочку процедур/драйверов

Кстати, DBF какого формата ? Нет ли к ним индексов ? (FoxPro любит прописывать индексы прямо в таблицу и провайдеры, ессно, эти индексы автоматом цепляют. А с индексами вставка идет в разы медленнее).

Если индексов нету - тогда надо переходить на прямую запись в файл DBF. Благо она не сложно пишется.

ЗЫ. Коллега написал хреновато, посему могу предложить свой исходник.


 
slaga ©   (2005-12-01 15:53) [16]


> ANB ©   (01.12.05 14:41) [15]


Нет индексов нет, а на исходник с удовольствием посмотрю.


 
Anatoly Podgoretsky ©   (2005-12-01 16:07) [17]

ANB ©   (01.12.05 14:41) [15]
А я бы посоветовал делать запись в динамический массив, и уж потом двумя.тремя командами записи быстро все сбросить на диск. Можно весьма кардинально повысить скорость, конечно при правильном написании.


 
ANB ©   (2005-12-01 17:07) [18]


> Anatoly Podgoretsky ©   (01.12.05 16:07) [17]

Это если напрямую в файл ? Так пусть переколбасит, как ему надо. У меня все равно только чтение. Главное - идея.


> slaga ©   (01.12.05 15:53) [16]

Ща отправлю. Только дописывать все равно самому придется.


 
alex_*** ©   (2005-12-01 17:13) [19]

вы сурсами для записи в DBF обмениваетесь чтоль? Велосипед изобретаете?


 
Slaga ©   (2005-12-01 17:17) [20]


> Anatoly Podgoretsky ©   (01.12.05 16:07) [17]


А можно поподробнее на тему " двумя.тремя командами записи быстро все сбросить на диск", пожалуйста.


 
ANB ©   (2005-12-01 17:23) [21]


> alex_*** ©   (01.12.05 17:13) [19]

Угу. Я еще прошлый год написал - сильно приперло, а взять негде было. Пришлось 3 дня убить. Правда, все равно делать нечего было.


 
Anatoly Podgoretsky ©   (2005-12-01 21:30) [22]

Первой командой записывается буфер с заголовком
Второй командой записывается буфер с данными (динамический массив)
Третей командой записывается признак конца файла, не помню есть ли по формату.
Для записи удобен TFileStream


 
Anatoly Podgoretsky ©   (2005-12-01 21:31) [23]

ANB ©   (01.12.05 17:23) [21]
Два дня и 7 часов на изучение формата и час на написание.


 
ANB ©   (2005-12-02 09:34) [24]


> Anatoly Podgoretsky ©   (01.12.05 21:30) [22]

Нету там признака конца файла.
Но я бы сделал следующие этапы :
1. Запись заголовка
2. Запись описания полей
3. Запись данных
Т.к. на данных самые тормоза - то их лучше одной командой записать.
Если таблица создана заранее, то первые 2 пункта нужно заменить на чтение заголовка и описания полей.


 
Anatoly Podgoretsky ©   (2005-12-02 12:12) [25]

ANB ©   (02.12.05 09:34) [24]
Пункты 1 и 2 это заголовок, конечно он состоит из двух частей, при том вторую можно реализовать динамическим массивом, а первую статическим.
Где то есть признак конца, вроде бы во втором заголовке - код 1А
Мне просто лень открывать спецификацию, поскольку нет практической задачи. А вот когда буду писать, то спецификация будет под ругой и код будет делаться в строгом соответствии с ней.


 
ANB ©   (2005-12-02 12:25) [26]


> Anatoly Podgoretsky ©   (02.12.05 12:12) [25]

Первую часть (собственно заголовок) лучше всего в рекорд запихать и не парится.
Признака конца там не было (FoxPro и Clipper). Там все на смещениях построено и вычисляется.


 
Anatoly Podgoretsky ©   (2005-12-02 12:31) [27]

Говорю нет под рукой спецификации, только дома, но настаиваю на признаке окончания и его коде 1А
Если очень интересует, то могу дома посмотреть.


 
ANB ©   (2005-12-02 12:42) [28]


> Anatoly Podgoretsky ©   (02.12.05 12:31) [27]

Да хрен с ним. Мне тоже пока не надо. Спецификация у меня у самого дома есть. А есть ли этот код окончания - можно прямо в DBF глянуть, сгенеренную стандартными средствами. Впрочем, он может быть не во всех форматах.



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

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.054 c
15-1136356025
begin...end
2006-01-04 09:27
2006.01.29
С Днём рождения! 4 января


2-1136891951
Foxtrot
2006-01-10 14:19
2006.01.29
Запись в порт при помощи API (стандартных средств)


2-1137065966
HITMAN
2006-01-12 14:39
2006.01.29
IdSMTP


1-1135767790
ASMiD
2005-12-28 14:03
2006.01.29
Экспорт данных в Excel


15-1136886264
syte_ser78
2006-01-10 12:44
2006.01.29
распайка СОМа