Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как ускорить выгрузку! [D6, IB5.x, Paradox]


off ©   (2003-04-21 14:04:00) 

Добрый день мастера, сейчас занимаюсь переводом таблиц Paradox на 3-й диалект, т.е. в InterBase. И все было ничего, пока не добрался до больших таблиц. Пока перегонял таблички по 20-40 тыс. записей все происходило в течение считаных минут, а вот с 980 тыс. записей перегнать оказалось гораздо сложнее, вернее сказать, дольше. Проблема же состоит в перекачке таблицы из 3 млн. записей. Тут комп виснет окончательно и после трех часов напряженной работы сообщает, что системе не хватает ресурсов и гасит мою прогу. Для перекачки использую TTable (исходная таблица) IBDataSet (собственно куда перегоняем). Вопрос же остается прежним, что может ускорить перекачку данных?


off   (2003-04-22 08:26:00) [1]


> Zacho ©


> А CachedUpdates и Refresh тебе вообще не нужны

Я бы согласился, если бы не результаты тестирования перекачки таблицы из 40 тыс. записей следующие:

CachedUpdates:=true - 0:00:56
CachedUpdates:=false - 0:01:39

На мой взгляд преимущество очевидно.


Виталий Панасенко   (2003-04-21 17:19:00) [2]

Ресурсов тебе,кажись, не хватает из-за CashUpdate=True Ведь это что-то где-то в ОЗУ находится ...


NickBat   (2003-04-21 17:15:00) [3]

Вариант предложенный Zacho © (21.04.03 16:14), на мой взгляд медленный.
Как-то у меня возникла задача перегнать данные из dBase в Firebird. Метод перебора оказался медленнее, причем гораздо, чем сброс данных во внешний файл со скриптом, а затем обработка этого скрипта IBExpert.
Однако объемы у меня были гораздо меньше 3 млн. записей.

Судя по всему работа разовая, и главное тут качество. Так что слушайся Соловьева.


Zacho   (2003-04-21 16:14:00) [4]


> off © (21.04.03 15:06)

Например, так:
Пусть есть таблица MY_TABLE с полями ID,NAME.
Соответственно, есть TTable для этой таблице в парадоксе.
Берем TIBSQL. В св-ве SQL пишем INSERT INTO MY_TABLE (ID,NAME) VALUES (:ID,:NAME)
Потом:
Table.First;
while not Table.Eof do
begin
IBSQL.ParamByName("ID").Value:=Table.FieldByName("ID").Value;
IBSQL.ParamByName("NAME").Value:=Table.FieldByName("NAME").Value;
IBSQL.ExecQuery;
Table.Next;
end;
А CachedUpdates и Refresh тебе вообще не нужны


Mike Kouzmine   (2003-04-21 15:20:00) [5]

А DataPump не пробовал?


off   (2003-04-21 15:06:00) [6]

Может, я сейчас глупость спрошу и мне будет стыдно, но все же
> используй TIBSQL
, а как?


Соловьев   (2003-04-21 14:54:00) [7]


> никакой кроме того, что прога виснуть не будет

я думаю это самое главное - убрать лучше глюк чем со свистом ганять воздух...


off   (2003-04-21 14:53:00) [8]


> Соловьев ©


> а частями нельзя?

Можно и частями, только думаю начальство будет не в восторге, да и выгоды практически никакой кроме того, что прога виснуть не будет. Ну так это не главное.


Соловьев   (2003-04-21 14:52:00) [9]

пакетами почему не хочешь? перегнал 10 000 - коммит, и так далее.
очисть ресурсы.


off   (2003-04-21 14:50:00) [10]

> Zacho ©
UniDirectional:=true поставил, CachedUpdate и ForcedRefresh тоже поставил true, на всякий случай. Пробовал перегонять через IBTable, но результаты примерно аналогичные.


Zacho   (2003-04-21 14:09:00) [11]

В IBDataSet поставь UniDirectional:=true или используй TIBSQL


Соловьев   (2003-04-21 14:06:00) [12]


> Для перекачки использую TTable (исходная таблица)

а частями нельзя?


Наверх

Титульная страница Поиск, карта сайта Написать письмо