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

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

Перебор записей в DataSet [D7, MSSQL]


Александр Ч_ ©   (2003-06-26 16:58:00) 

Простой вопрос. Перебор записей (AdoDataSet) в конструкции типа

While not dmConvert.ADODataSetEKS.Eof do begin
dmConvert.ADODataSetEKS.Next;
end; // While not

выполняется очень медленно (40 000) записей примерно 15 -20 сек.
Это так и есть или можно как-то ускорить?


sniknik   (2003-06-26 18:36:00) [1]

то же самое что sniknik © (26.06.03 18:12)
только с положением clUseServer
и типом
ctDynamic - 24,8-24,9сек
ctOpenForwardOnly - 24,3 - 24,5сек

(2 замера конечно не показатель)

> влить все данные куда-нибудь
> виртуально, без файлов, чтоб потом быстро перебрать.
рекордсет это как раз и есть виртуальное (в памяти) хранилище данных.


Fiend   (2003-06-26 18:16:00) [2]

То Александр Ч_:
для создания курсора никаких дополнительных прав кроме на чтение данных не надо


Александр Ч_   (2003-06-26 18:12:00) [3]

Я бы рад, но нельзя на сервере ничего делать (БД чужая, только на
чтение данных)


sniknik   (2003-06-26 18:12:00) [4]

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

хотя счас посмотрел 78848зап закачиваются (курсор clUseClient), чуть больше секунды. перебор еще одну. причем с подключением ... ets. так что у тебя точно долго (но может данные обьемные, по 100 полей в таблице?)
весь код.

var OldTime: TDateTime;
ErrMessage: string;
begin
Label1.Caption:= "0:00:000";
OldTime:= Now;

ADOConnection1.Connected:= False;
ADOConnection1.ConnectionString:= "Provider=SQLOLEDB;Persist Security Info=False;User ID=sa;Initial Catalog=Northwind";
ADODataSet1.CommandText:= "SELECT * FROM Sl1_Category";
ADODataSet1.Open;
ADODataSet1.DisableControls;
While not ADODataSet1.Eof do begin
ADODataSet1.Next;
end;
ADODataSet1.EnableControls;
DateTimeToString(ErrMessage, "n:ss:zzz", Now - OldTime);
Label1.Caption:= ErrMessage;
end;


работает около 2,4сек. (в таблице напомню 78848зап)


Fiend   (2003-06-26 18:08:00) [5]

То Александр Ч_:
А что же на родном для вас языке SQL нельзя эту сложную текстовую обработку сделать прямо на сервере, например используя курсор?


Александр Ч_   (2003-06-26 18:05:00) [6]

Попробовал ту же таблицу из dbf перебрать - 0 секунд получилось.
Но не хочу я в dbf.

Скажите лучше, как из dataSet влить все данные куда-нибудь
виртуально, без файлов, чтоб потом быстро перебрать.


Александр Ч_   (2003-06-26 17:59:00) [7]


Sandman25 . SQL для меня родной язык,но в данной ситуации не прокатит.

Задача такая. Нужно перебрать на клиенте. (сложная текстовая обработка). Может их в какую временную таблицу запихать, типа dbf, но лучше что-нибудь в памяти создать.
Получится?


Sandman25   (2003-06-26 17:48:00) [8]

Не надо тащить на клиента 40.000 записей. Используйте секцию WHERE.


Александр Ч_   (2003-06-26 17:41:00) [9]

Делать надо, конечно, но и так медленно.


sniknik   (2003-06-26 17:40:00) [10]

>While not dmConvert.ADODataSetEKS.Eof do begin
> dmConvert.ADODataSetEKS.Next;
>end; // While not

вот просто так без ничего? просто перебор?

ускоряется -
при положении курсира на clUseServer установкой типа курсора ctOpenForwardOnly.
при clUseClient цикл пройдет еще быстрей но потратится время на предварительную закачку рекордсета(ее время считается? судя по вопросу/коду нет). что в сумме будет быстрей надо сравнить.

если уже так стоит, считай что это нормально. (даже нет, много не выиграеш)


Johnmen   (2003-06-26 17:26:00) [11]

15 -20 сек. - нормально для 40 000 записей
:)))


Соловьев   (2003-06-26 17:02:00) [12]

просто перебрать надо? или что еще надо делать? AfterScroll не обрабатывается?


Наверх

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