Форум: "Базы";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
ВнизСбросить данные из таблицы в файл. Найти похожие ветки
← →
S@shka © (2006-05-17 18:31) [0]Народ есть вот какая задача.
1. Данные из большой таблицы сбросить в файл.
2. Файл перенести.
3. Окрыть и вставить эти данные в другую таблицу.
Делаю это через TIBClientDataSet (пока что):
open;
savetofile ();
- все получается но в процессе выполнения запроса select(данных много) приложение расходует много оп. памяти до 100 мб.
соответственно тормоза!
Второй вариант сделать тоже самое через IBSQL.BatchOutput - тут все здорово - данные методично отправляются в файл (память расходуется разумно) но я при обработке данных на приемнике несколько меняю запрос insert ((
Т.к. на второй стороне я открываю IBClientDataset и "шагаю" по ней мне было удобно чтобы на этапе select IBClientDataset тоже бы сбрасывал данные методично сразу в файл.
Можно ли этого как то добиться?
Или мож я вообще не тем путем иду?
← →
Desdechado © (2006-05-17 18:36) [1]тебе это регулярно делать или разово?
проще выгрузить в скрипт, а потом скриптогонялкой выполнить его на другой базе
← →
S@shka © (2006-05-17 18:39) [2]Под скриптом имеется ввиду?
Сделать select и данные сохранить в ввиде текстового файла
insert ... into ... values ... ;
commit;
???
Так это тож самое что BatchOutPut сделать ?
← →
Desdechado © (2006-05-17 18:55) [3]ты не ответил на первый вопрос
а скрипт можнос конструировать уже так, чтоб не нужно было "на приемнике несколько меняю запрос insert"
тогда и грузить в CDS смысла не будет
← →
S@shka © (2006-05-17 18:56) [4])))
Отвечаю на первый вопрос -
это делается редко.
Но надо большим массивом данных
← →
atruhin © (2006-05-17 19:29) [5]Ну так используй Query а вывод в файл формируй сам как нужно, это несколько строк кода.
При вставке построчно читаешь файл и обновляешь базу, будет медленней зато без расхода памяти.
← →
atruhin © (2006-05-17 19:34) [6]
> [1] Desdechado © (17.05.06 18:36)
Вообще я бы при выгрузке формировал не набор опраторов insert, а запрос на вставку, и список параметров, так как при выполнении скрипта (т.е. в операторе insert константы) запрос будет каждый раз компилироваться и вычисляться план, что может быть гораздо медленнее, в разы.
← →
S@shka © (2006-05-17 19:39) [7]
> Ну так используй Query а вывод в файл формируй сам как нужно,
> это несколько строк кода.
> При вставке построчно читаешь файл и обновляешь базу, будет
> медленней зато без расхода памяти.
Как в этом случае интерпретировать NULL значения?
← →
atruhin © (2006-05-17 19:44) [8]Так и пиши в текстовый файл как NULL, строки квотированные, если одна строка - одна запись, не забыть заменить #13#10, я делал подобное для экспорта, работает нежалуюсь :)
← →
atruhin © (2006-05-17 19:47) [9]Очень удобная библиотека для быстрого квотирования, замены управляющих символов, парсинга есть на сайте Alex Konshin модуль называется StringConv лет 5 пользуюсь.
← →
Sergey13 © (2006-05-18 09:04) [10]2S@shka © (17.05.06 18:31)
Можно попробовать через внешнюю таблицу перегнать.
← →
S@shka © (2006-05-18 23:50) [11]А вот странно - я все таки решил
делать через
IBSQL.BatchInput(F:TIBInputRawFile)
только вот не пойму
открываю я транзакцию
стартую процесс
после окончания закрываю транзакцию
а если много данных вливается до 1.000.000 записей
там ведь (в исходнике реализации BatchInput) - нет периодического подтверждения транзакции?
Это нормлаьно?
← →
Petr V. Abramov © (2006-05-19 01:26) [12]если таблица большая, лучше использовать внешние таблицы FB. И быстро, и программирования меньше
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.055 c