Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизInterbase .... уходит слишком много времени... Найти похожие ветки
← →
pok (2004-05-20 16:06) [0]Доброе время суток уважаемые мастера!
У меня такой вопрос..
Я загружаю даные из текстового файла в котором 600тыс. записей в таблицу INTERBASE используя компненты IBX.
Добавление новых записей происходит с помощью компонента IBQuery
и insert into.....values...
полностью перегонка даных происходит гдето за 10мин.
как можна прискорить этот процес...
и ещо одно, после того как я удаляю все записи з бази (delete from table1) размер базы на диске не уминшаетсья....почему и как это исправить..???
Зарание благодарен!!!!!!!!
← →
Vlad © (2004-05-20 16:11) [1]
> полностью перегонка даных происходит гдето за 10мин.
> как можна прискорить этот процес...
Ну вобще-то очень даже нормальное время, сомневаюсь что удастся существенно ускорить.
Общие рекомендации такие: отключить все индексы в таблице, использовать запрос с параметрами.
> и ещо одно, после того как я удаляю все записи з бази (delete
> from table1) размер базы на диске не уминшаетсья....почему
>
Backup/Restore
Читай статьи на ibase.ru там все про это написано
← →
pok (2004-05-20 16:12) [2]Пробовал с DBF...время гдето около 1 мин.
← →
Desdechado © (2004-05-20 16:15) [3]в одной транзакции, возможно, будет быстрее
по поводу размера не волнуйся, так надо, просто потом это незадействованное место будет заниматься по мере необходимости другими данными уже без прироста размера БД
← →
Vlad © (2004-05-20 16:17) [4]
> pok (20.05.04 16:12) [2]
> Пробовал с DBF...время гдето около 1 мин.
С большим трудом верится.
С транзакциями как работаешь ? подтверждаешь после каждого insert или один раз в конце ?
← →
pok (2004-05-20 16:19) [5]Транзакция один раз в конце..
← →
Vlad © (2004-05-20 16:20) [6]
> pok (20.05.04 16:19) [5]
сами запросы как формируешь, с параметрами или как ?
← →
Digitman © (2004-05-20 16:21) [7]если такая разница во времени, то значит ты криво или неоптимально считываешь данные из текст.файла, прежде чем вставить их
ты поди в стринг-лист записи грузишь при считывании ?
← →
pok (2004-05-20 16:22) [8]Запрос
insert into table1(Name1,Name2,Name3) values("XXX","ZZZ","YYY")
← →
pok (2004-05-20 16:26) [9]1.Считал строку из файла
2.Разбил на части и просвоил переменным
3.Сформировал запрос
4.Виполнил запрос
и с DBF и с Interbase процедура считования одна и та же..
← →
Vlad © (2004-05-20 16:26) [10]
> pok (20.05.04 16:22) [8]
говорю, чтобы быстрее было, запрос с параметрами делать надо:
insert into table1(Name1,Name2,Name3) values(:Name1,:Name2,:Name3) - фирштейн ?
Однако это такого уж значительного ускорения не даст.
Сколько полей в таблице и каких типов ?
← →
pok (2004-05-20 16:27) [11]Всего 14 полей
13 - Varchar
1- Longint
← →
Курдль © (2004-05-20 16:28) [12]А если сначала все данные из таблицы единым скриптом оформить, а потом его разом залить?
← →
Vlad © (2004-05-20 16:28) [13]
> pok (20.05.04 16:27) [11]
> Всего 14 полей
> 13 - Varchar
> 1- Longint
Батенька, не надо лапшу людям вешать по поводу одной минуты.
10 минут для такого объема данных - это нормально.
← →
Digitman © (2004-05-20 16:36) [14]
> 1.Считал строку из файла
> 2.Разбил на части и просвоил переменным
вот здесь и есть "засада" :
- операция считывания строки из неструктурированного и неиндексированного текст.файла сама по себе ощутимо дольше длится, нежели операция перемещения курсора в структурированной таблице, пусть даже она и не индексирована
- алгоритм разбиения строки на части, даже самый оптимальный (в чем сомневаюсь в дан.случае), не сравнится с операцией доступа к полю записи структурированного НД и считывания этого поля в память
← →
Соловьев © (2004-05-20 16:42) [15]
> полностью перегонка даных происходит гдето за 10мин.
Делать коммиты каждые 5-10 тыс записей.
← →
Курдль © (2004-05-20 16:44) [16]
> говорю, чтобы быстрее было, запрос с параметрами делать
> надо:
> insert into table1(Name1,Name2,Name3) values(:Name1,:Name2,:Name3)
> - фирштейн ?
> Однако это такого уж значительного ускорения не даст.
Это с какого перепугу, интересно?
← →
Vlad © (2004-05-20 16:45) [17]
> Digitman © (20.05.04 16:36) [14]
Даже если выбросить операцию с текстовым файлом, то 600 тыс записей при 13 varchar полях ну никак за одну минуту не пройдут.
Это значит скорость вставки д.б. 10000 записей/сек.
При двух-трех полях в базе такая скорость еще возможна, но не более. Да и то если база локальная, а по сети еще медленнее.
← →
Vlad © (2004-05-20 16:49) [18]
> Курдль © (20.05.04 16:44) [16]
> Это с какого перепугу, интересно?
Пугается она параметров. И с перепугу быстрее работает.
← →
Соловьев © (2004-05-20 16:51) [19]Быстрее всего работать будет, если создать скрипт написать через каждые 5-10 тыс commit и послать его на ibsql.exe
← →
Johnmen © (2004-05-20 16:52) [20]При массовой вставке коммиты, насколько помню, рекомендуется делать через каждые ~500 записей.
← →
Курдль © (2004-05-20 16:58) [21]
> Johnmen © (20.05.04 16:52) [20]
> При массовой вставке коммиты, насколько помню, рекомендуется
> делать через каждые ~500 записей.
Кем это, интересно, рекомендуется? Лучшими собаководами?
Я проверил у меня в 2-х СУБД заливка скрипта 20 000 строк (это, конечно, не 600 000) записей в 4 разные таблицы последовательно (банки со всеми их адресами, счетами и телефонами) промелькивают за 30 секунд. Коммит в конце.
← →
Digitman © (2004-05-20 17:06) [22]
> Vlad © (20.05.04 16:45) [17]
>
> Даже если выбросить операцию с текстовым файлом, то 600
> тыс записей при 13 varchar полях ну никак за одну минуту
> не пройдут.
да хоть за полчаса ! не столь это важно здесь ..
я не об этом, а об относительной разнице во времени в случае с упомянутыми источниками данных
← →
Johnmen © (2004-05-20 17:07) [23]>Курдль © (20.05.04 16:58) [21]
См. тип СУБД в вопросе автора. Речь не о сабаках по-моему...
Проверять можешь хоть на Informix, хоть на Revelation, хоть на кошках.
← →
jack128 © (2004-05-20 17:18) [24]
> Кем это, интересно, рекомендуется? Лучшими собаководами?
эти рекомендации давались разработчиками IB.
> Я проверил у меня в 2-х СУБД заливка скрипта 20 000 строк
> (это, конечно, не 600 000) записей в 4 разные таблицы последовательно
> (банки со всеми их адресами, счетами и телефонами) промелькивают
> за 30 секунд. Коммит в конце.
600000/20000 * 30 = 900 сек = 15 минут, а автор это за минут умудряется сделать ;-)
А вот можно такой вопрос, что за задача такая? Все таки, думаю, такие объемы не каждый день гоняются, народу что, лень 10 минут перекурить? ;-)
← →
Vlad © (2004-05-20 17:24) [25]
> Курдль © (20.05.04 16:58) [21]
Неоптимально делаешь, видишь как jack128 быстро посчитал :)
← →
pok (2004-05-20 18:24) [26]Задача это такая....есть цыфровая междугородняя станция которая создаёт текстовий файл с информацией о разговорах....перекачка файла на ПК происходит каждых 2 часа и занимает где то 15мин. после этого нужно этот файл загнать в базу проанализировать, распечатать и зделать архивную копию...
все это уже работает в тестовом режыме но все равно слишком много
времени уходит на перегонку базы....
← →
Vlad © (2004-05-20 18:41) [27]
> pok (20.05.04 18:24) [26]
Ну не получится у тебя быстро загнать 600 тыс. записей в таблицу с 13 varchar полями !
Хотя есть впринципе мысль.
Что если разбить твой текстовый файл к примеру на 5 частей, затем создать 5 потоков (TThread), которые одновременно будут писать в базу ? Я просто не знаю как IB работает в потоках, но например в Оракле я такую штуку делал, скорость перекачки взлетала раз в 5
← →
jack128 © (2004-05-20 18:47) [28]вообще мое имхо, чтот существенноты скорость закачки данных в базу не увеличишь. Разве, что покопать в сторону external files, возможно решение здесь...
← →
Vlad © (2004-05-20 18:51) [29]
> jack128 © (20.05.04 18:47) [28]
Нет, почему же, с несколькими потоками можно очень даже существенно увеличить скорость, говорю же, я на Оракле именно так и делал. Но я не знаю как IB ведет себя в потоках
← →
jack128 © (2004-05-20 18:55) [30]Еще раз внемательно перечитал ветку :-) Но так и не увидел коментарий автора на реплику Digitmen"a. Какое соотношение по времени на парсинг текст файла и вставки данных в базу. Что оптимизируем то???
> Но я не знаю как IB ведет себя в потоках
я то же. Поэтому предложил очевидный вариант. В принципе при удачном стечении обстоятельств все это можно закинуть в базу за 1 сек при помощи внешних файлов.
← →
Курдль (2004-05-20 23:22) [31]А если написать процедурину, принимающую параметрами эти самые 14 полей без лишнего текста, то можно уменьшить сетевой трафик в несколько раз.
← →
Mike Kouzmine © (2004-05-20 23:57) [32]За 1 минуту с разбором строк из текстового файла - может быть, но верится с трудом. 10 минут для перегона 600000 вполне приемлимое время. Тем более раз в 2 часа. Еще времени останеться чтобы чай попить.
← →
Digitman © (2004-05-21 08:08) [33]использование доп.потоков никак не влияет на конечную производительность
← →
Vlad © (2004-05-21 09:44) [34]
> Digitman © (21.05.04 08:08) [33]
> использование доп.потоков никак не влияет на конечную производительность
Сомнительное утверждение, тем более что опровергнутое практикой
(если конечно под конечной производительностью понимается скорость добавления записей в базу)
← →
Tomkat (2004-05-21 10:19) [35]а по-моему, нада копать в др. сторону : пусть АТС пишет не в текстовый файл, а во что-то, что похоже на БД...как и во что - это уже домыслить нада ....у нас станция пишет в Paradox и ниче ...
← →
Соловьев © (2004-05-21 10:21) [36]
> [35] Tomkat (21.05.04 10:19)
так пусть уж пишет сразу туда куда надо :) зачем лишнее звено? :)
← →
Rule © (2004-05-21 10:38) [37]и я согласен с тем что 10 минут это номрально, скорость света не переплюнешь :(
может мне мало тактовой частоты процессора в 10 Гигагерц, и меня не волнует что природно больше не возможно сделать, так что теперь ?
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.03 c