Форум: "Базы";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
ВнизПеребор записей в DataSet Найти похожие ветки
← →
Александр Ч_ (2003-06-26 16:58) [0]Простой вопрос. Перебор записей (AdoDataSet) в конструкции типа
While not dmConvert.ADODataSetEKS.Eof do begin
dmConvert.ADODataSetEKS.Next;
end; // While not
выполняется очень медленно (40 000) записей примерно 15 -20 сек.
Это так и есть или можно как-то ускорить?
← →
Соловьев (2003-06-26 17:02) [1]просто перебрать надо? или что еще надо делать? AfterScroll не обрабатывается?
← →
Johnmen (2003-06-26 17:26) [2]15 -20 сек. - нормально для 40 000 записей
:)))
← →
sniknik (2003-06-26 17:40) [3]>While not dmConvert.ADODataSetEKS.Eof do begin
> dmConvert.ADODataSetEKS.Next;
>end; // While not
вот просто так без ничего? просто перебор?
ускоряется -
при положении курсира на clUseServer установкой типа курсора ctOpenForwardOnly.
при clUseClient цикл пройдет еще быстрей но потратится время на предварительную закачку рекордсета(ее время считается? судя по вопросу/коду нет). что в сумме будет быстрей надо сравнить.
если уже так стоит, считай что это нормально. (даже нет, много не выиграеш)
← →
Александр Ч_ (2003-06-26 17:41) [4]Делать надо, конечно, но и так медленно.
← →
Sandman25 (2003-06-26 17:48) [5]Не надо тащить на клиента 40.000 записей. Используйте секцию WHERE.
← →
Александр Ч_ (2003-06-26 17:59) [6]
Sandman25 . SQL для меня родной язык,но в данной ситуации не прокатит.
Задача такая. Нужно перебрать на клиенте. (сложная текстовая обработка). Может их в какую временную таблицу запихать, типа dbf, но лучше что-нибудь в памяти создать.
Получится?
← →
Александр Ч_ (2003-06-26 18:05) [7]Попробовал ту же таблицу из dbf перебрать - 0 секунд получилось.
Но не хочу я в dbf.
Скажите лучше, как из dataSet влить все данные куда-нибудь
виртуально, без файлов, чтоб потом быстро перебрать.
← →
Fiend (2003-06-26 18:08) [8]То Александр Ч_:
А что же на родном для вас языке SQL нельзя эту сложную текстовую обработку сделать прямо на сервере, например используя курсор?
← →
Александр Ч_ (2003-06-26 18:12) [9]Я бы рад, но нельзя на сервере ничего делать (БД чужая, только на
чтение данных)
← →
sniknik (2003-06-26 18:12) [10]может можно все сделать на стороне сервера, продумай задачу, может и качать ничего не придется, и циклов не будет.
хотя счас посмотрел 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:16) [11]То Александр Ч_:
для создания курсора никаких дополнительных прав кроме на чтение данных не надо
← →
sniknik (2003-06-26 18:36) [12]то же самое что sniknik © (26.06.03 18:12)
только с положением clUseServer
и типом
ctDynamic - 24,8-24,9сек
ctOpenForwardOnly - 24,3 - 24,5сек
(2 замера конечно не показатель)
> влить все данные куда-нибудь
> виртуально, без файлов, чтоб потом быстро перебрать.
рекордсет это как раз и есть виртуальное (в памяти) хранилище данных.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c