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

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

Увеличение скорости обработки данных [D7]


sally ©   (2006-01-05 11:47:00) 

В Microsoft DTS очень быстро происходит "перекачка" данных с "источника" в "назначение". 14000 записей залетают за 1-2 секунду(из DBF в SQL Server). За счет чего достигается такая скорость.
Код максимально простой.

var
 AsF1, AsF2, AsF3, AsF4, AsF5, AsF6, AsF7: TField;
 AdF1, AdF2, AdF3, AdF4, AdF5, AdF6, AdF7: TField;
begin
 ADOConnection1.Execute('truncate table COM_PAYERSRECIVER');
 VKDBFNTX1.Open;
 ADOTable1.Open;
 AsF1 := VKDBFNTX1.FindField('ID');
 AsF2 := VKDBFNTX1.FindField('CODE');
 AsF3 := VKDBFNTX1.FindField('NAME');
 AsF4 := VKDBFNTX1.FindField('UNN');
 AsF5 := VKDBFNTX1.FindField('OKPO');
 AsF6 := VKDBFNTX1.FindField('LICENS');
 AsF7 := VKDBFNTX1.FindField('PHONE');

 AdF1 := ADOTable1.FindField('ID');
 AdF2 := ADOTable1.FindField('PAYERSCODE');
 AdF3 := ADOTable1.FindField('PAYERSNAMES');
 AdF4 := ADOTable1.FindField('UNN');
 AdF5 := ADOTable1.FindField('OKPO');
 AdF6 := ADOTable1.FindField('LICENS');
 AdF7 := ADOTable1.FindField('PHONE');
 while not VKDBFNTX1.Eof do
 begin
   ADOTable1.Append;
   //ADOTable1.FieldValues['ID;PAYERSCODE;PAYERSNAMES;UNN;OKPO;LICENS;PHONE'] := VKDBFNTX1.FieldValues['ID;CODE;NAME;UNN;OKPO;LICENS;PHONE'];
   AdF1.Value := AsF1.Value;
   AdF2.Value := AsF2.Value;
   AdF3.Value := AsF3.Value;
   AdF4.Value := AsF4.Value;
   AdF5.Value := AsF5.Value;
   AdF6.Value := AsF6.Value;
   AdF7.Value := AsF7.Value;
   ADOTable1.Post;
   VKDBFNTX1.Next;
 end;
 ADOTable1.Close;
 VKDBFNTX1.Close;

Больше никаких действий нет(ни на DataSet, ни на форме).
При этом занимает это действо 15 секунд на той же машине.


sniknik   (2006-01-05 13:34:00) [1]

одной командой
INSERT INTO Table1 SELECT * FROM OpenRowset('Microsoft.Jet.OLEDB.4.0','dBase IV;DATABASE=D:\','select * from Table2')

путь (сдесь D:\) считается от сервера (mssql)
имена в запросе придется подобрать (т.е. вместо * -> ...PAYERSCODE AS CODE... чтобы не зависело от порядка полей)

кроме ADOTable (оно и скорость несовместимы. образно говоря), еще бы посоветовал не использовать ADOConnection1.Execute, вместо этого взять нормальный ADOCommand привязать его к конекту и юзать его (в этом случае неважно, но если понадобятся параметры... (для той же скорости выполнения), привыкай в общем нормально писать)


Anatoly Podgoretsky   (2006-01-05 13:05:00) [2]

sally   (05.01.06 13:04) [5]
Они не используют Table


sally   (2006-01-05 13:04:00) [3]

Дело то не в DTS, а в том, как бы в своих программах ускорить изменение\добавление данных на больших объемах. Ведь как то Microsoft умеет это делать быстро. И вряд ли там(в DTS) используется просто SQL, т.к. можно написать обработку полей на VBS.


Anatoly Podgoretsky   (2006-01-05 12:19:00) [4]

DTS у клиентов не устанавливается


Плохиш   (2006-01-05 11:57:00) [5]

Тогда
1. Выкинуть ADOTable1
2. использовать транзакции
3. использовать "INSERT INTO ..." с параметрами

PS. Вполне возможно, что есть возможность вставить записи из DBF с помощью одного SQL-запроса. Читай документацию.


sally   (2006-01-05 11:49:00) [6]

Хотя бы то, что не у каждого клиента установлен DTS


Плохиш   (2006-01-05 11:48:00) [7]

Что мешает использовать DTS в своей программе?


Наверх

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