![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Увеличение скорости обработки данных [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 в своей программе?