Форум: "Базы";
Текущий архив: 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