Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Занесение результата запроса в массив


Автор: Lunatikus 11.12.2007, 13:37
Здравствуйте.
Подскажите,возможно ли результат запроса(база MS SQL 2000,ADOQuery) занести в массив данных без использования перебора с помощью Next?
Слишком уж длительным становится выполнение некста даже по 1млн. записей,поэтому хочу занести сначала данные в массив и перебирать их там.

Автор: Deniz 12.12.2007, 08:59
Lunatikus, делай однонаправленный курсор.
Цитата(Lunatikus @  11.12.2007,  16:37 Найти цитируемый пост)
Слишком уж длительным становится выполнение некста 
длительно не Next, а выбор и пересылка записей от сервера к клиенту (1 млн  smile клиенту не нужен).
Без Next скорее всего не обойтись.
А ты уверен, что 
Цитата(Lunatikus @  11.12.2007,  16:37 Найти цитируемый пост)
хочу занести сначала данные в массив и перебирать их там
будет быстрее чем ADOQuery? Может тогда обработку на сервере в процедуре сделать?

Автор: Vas 12.12.2007, 11:07
А для чего их перебирать, может стоит условие перебора сразу в запрос воткнуть и выбрать только те записи что нужны. 
Ну а ежели все обработать надо по-любому, то процедура на сервере и вперед, в этом и плюс сервера, что не надо таскать записи по сети, которая является самой медленной частью передачи данных, сервер обработает сам все и намного быстрее. 

Автор: Lunatikus 12.12.2007, 13:39
хм.Спасибо за разъяснения.Это получается,что клиент получил результат выборки.Далее он запрашивает некст и сервер снова пересылает данные?Я думал,что клиент работает с тем,что получил.
Ну если так,то буду делать процедуру на сервере.

Автор: Deniz 13.12.2007, 06:32
Lunatikus, не совсем правильно понял.
Клиент послал запрос на сервер и получил ответ (возможно была ошибка и т.д.).
Сервер пересылает метаданные по запросу(поля, типы и т.д.)
Клиент запрашивает порцию данных (в зависимости от компонент и настроек 1, порция или все записи)
Далее Next двигает указатель по локальному набору на клиенте, если указатель дошел до конца локального набора, то запрашивается следующая порция с сервера и так до тех пор, пока не прочитаются все записи с сервера по заданному запросу. И это (все считанные записи с сервера) хранится на клиенте в памяти/на диске - кто как умеет.
Если в клиенте выставить свойство однонаправленности, то на клиенте будет только 1 запись и Next, забрав следующую запись, перепишет ее поверх текущей, т.о. нельзя перейти на предыдущую запись, но сильно экономится память и возрастает скорость обработки.
Немного сумбурно описал, но ... я думаю будет понятно.

Автор: Lunatikus 13.12.2007, 14:13
Какими средствами выставляется однонаправленность?

Автор: Deniz 14.12.2007, 07:23
TADOQuery.CursorType

Из справки:
Код

ctUnspecified: A specific cursor type has not yet been specified.

ctOpenForwardOnly: Forward-only cursor in which you can only scroll forward; better performance because only requires single through recordset.

ctKeyset: Keyset cursor; records added by other users are not visible; records deleted by other users are inaccessible.

ctDynamic: Dynamic cursor; data modifications, deletions, and insertions by other users are visible; scrolling forward and back allowed.

ctStatic: Static cursor; static copy of records; data changes by other users not visible; used mostly for reporting.

PS: так же смотри CursorLocation и LockType возможно еще немного помогут.
PSS: не зная толком задачи можно насоветовать много чего, например:
  • асинхронное выполнение TADOQuery.ExecuteOptions
  • настройку уровней изоляции TADOConnection.IsolationLevel
  • и т.д.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)