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

Вниз

Что "лучше" использовать при выгрузке/загрузке данных из/в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.035 c
2-1137174021
St74
2006-01-13 20:40
2006.01.29
Как DLL правильно заполнить строковыми ресурсами, и потом достать


15-1136549265
BiggieSmalls
2006-01-06 15:07
2006.01.29
Реестр


2-1137254464
Compton's G
2006-01-14 19:01
2006.01.29
Консольное приложение


1-1135320391
john_mag
2005-12-23 09:46
2006.01.29
Rave Designer


15-1135004026
Esu
2005-12-19 17:53
2006.01.29
Мастре и Маргарита (сериал)





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