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

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

Быстрый способ заполнения массива данными из Query [D7, MySQL]


Страницы:   1 2 3

Fedia ©   (2004-10-19 05:43:00) 

Всем доброго времени суток.
У меня вот какой вопрос.

Есть в наличии:

 Query1: TZMySqlQuery;

 Unload_h = record
   date: TDate;
   id_ves: integer;
   id_ves_unload: integer;
   conosament: string;
   id_own_unload: integer;
   own_unload, ves_unload: string;
 end;

 ArUnloadU: array of Unload_h;

 ClearQuery(Query1); //очистка от данных предыдущего запроса
 Query1.Sql.Add('Select date, id_ves, id_ves_unload, ves_unload, conosament, id_own_unload, own_unload from unload_h');
 OpenDB(Query1); //Query1.Open, Query1.First и др.
 SetLength(ArUnloadU, Query1.RecordCount);
 //заполнение массива данными из Query1
 for i:=0 to Length(ArUnloadU)-1 do
 begin
   ArUnloadU[i].id_ves:=Query1.fieldByName('id_ves').AsInteger;
   ArUnloadU[i].id_own_unload:=Query1.fieldByName('id_own_unload').AsInteger;
   ArUnloadU[i].id_ves_unload:=Query1.fieldByName('id_ves_unload').AsInteger;
   ArUnloadU[i].date:=Query1.fieldByName('date').AsDateTime;
   ArUnloadU[i].ves_unload:=Query1.fieldByName('ves_unload').AsString;
   ArUnloadU[i].own_unload:=Query1.fieldByName('own_unload').AsString;
   ArUnloadU[i].conosament:=Query1.fieldByName('conosament').AsString;
   Query1.Next;
 end;

Непосредственно вопрос: имеется ли более быстрый способ заполнить массив ArUnloadU ?
PS Использование Query1.Fields вместо Query1.fieldByName предлагать нет нужды.


msguns   (2004-10-20 12:43:00) [1]

Согласен с Nikolay M. © и ЮЮ ©.
Шось пробз...ло в Датском короливсьтве.. В смысле кривость именно в концептуальной плоскости, а не алгоритмике.
Но, принимая во внимание
а) древность разработки
б) чужесть разработки
в) высокую степень "оригинальности" поставленных текущих задач в смысле их вопиющей выпадаемости из бизнес-логики модели БД
 можно предложить следующие соображения:

Исх.данные:
- Есть БД с весьма большим кол-вом записей
- Есть необходимость анализа цепочек (блоков) данных, связанных неявным (не заложенным в бизнес-логике) способом
- Большое кол-во "проходов" по ВСЕМУ массиву информации для установления полной картины рез.данных.

Задача:
- Оптимизировать алгоритмическипроцесс формирования вых.результатов по времени, максимально перенеся нагрузку на клиента.

Методы решения:
а. Концептуальный (ревизия бизнес-логики с весьма вероятным пере (до) проектированием структуры БД.   ОТПАДАЕТ
б. Алгоритмический. Попробовать максимально использовать преимущества "ручного" управления (собственными "тонкими" методами) перед стандартными (работа компонент через буферы ОЗУ)
в. Смешанный. Создаем пустую временную БД на клиенте со структурой и логикой данных, максимально  приближенной к решению поставленной задачи (делаем мин.кол-во таблиц с ключами/индексами, прямо участвующими в схемах лог.связей). Определяем для этой БД доп.логику, ускоряющую процесс выборки (индексы, ХП и т.д.) Заливаем в эту БД данные из "Общака" и запускаем собственно приложение.

Какой именно путь избрать - решать Федор, тебе. Пока ты идешь вторым. А лучшим ли ?
А вот подсказать уже по конкретике, представляя задачу и метод ее решения в целом - это уже дело Мастеров, а их в этой ветке уже немало нарисовалось.


Fedia   (2004-10-20 11:07:00) [2]

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

Johnmen ©   (20.10.04 09:13) [54]
>НД в памяти вполне можно рассмотривать, как массив.
Если НД - это набор данных Query, то это радует :)


Johnmen   (2004-10-20 09:13:00) [3]

>Fedia ©

НД в памяти вполне можно рассмотривать, как массив. И работа с ним ничуть не медленнее, чем с массивом (в той же памяти).


ЮЮ   (2004-10-20 04:36:00) [4]

>Закачка данных на клиента происходит по мере выполнения Query.Open

По Query.Open выполняется запрос на сервере, а количество переданных на клиент записей определяется настройками и потребностью клиента в этих записях.

Пробежав по всему датаsety мы гараниарованно передали на клиент все записи с сервера


Fedia   (2004-10-20 04:27:00) [5]

Всем доброго времени суток.

ЮЮ ©   (20.10.04 03:13) [51]
>закачка данных на клиента составляет лишь 1/26 времени заполнения массива
Закачка данных на клиента происходит по мере выполнения Query.Open, не так ли? Это простой перебор данных из Query занимает 1/26 времени заполнения массива (что уже не мало). Простой перебор данных из массива происходит значительно быстрей (см. [40]).
Подробнее о решаемой с использованием массивов задаче позже.


ЮЮ   (2004-10-20 03:13:00) [6]

>Anatoly Podgoretsky ©   (19.10.04 11:02) [44]
>Нельзя, массив то все равно надо заполнить, так что и .Next оставить и заполнение массива.

Цикл там организован по длине массива. Как следует из [33], закачка данных на клиента составляет лишь 1/26 времени заполнения массива, поэтому основная потеря при заполнении массива или при доступу к полям DataSeta.

Кстати, уже замена Query1.fieldByName('id_ves').AsInteger на
Query1.fiels[1].AsIntrger (и, соответственно, для других полей) приведет к значительному ускорению


KORSAR   (2004-10-19 15:40:00) [7]

А может из  Query1 можно получить указатель гле храняться выбранные данный и подложить их по указателю массву!


Deniz   (2004-10-19 13:29:00) [8]

Удалено модератором


Deniz   (2004-10-19 13:28:00) [9]

Удалено модератором


Deniz   (2004-10-19 13:27:00) [10]

>Fedia ©   (19.10.04 10:11) [26]
>>Ты для каждой из 100 000(!) записей делаешь кучу кривых запросов
>Если внимательно прочитать предыдущие постинги, то уже два года, как не делаю

Т.е. если я правильно считаю, то получается с ~октября 2002 года программа перешла на массивы? Сколько до этого работала на Query? Именно на каких компонентах?
Если верить Вашей анкете, то Вам тогда был 21 год. И уже такой опыт?


Deniz   (2004-10-19 13:11:00) [11]

Ответы сыпются аж  страшно становится ;-)
Вопрос к автору:
Если такой серьезный проект почему MySQL?
Какие компоненты доступа к MySQL?
Как проводилось сравнение массивов и "Query" (не знаю как эту кверю теперь называть)?
Если результат в EXCEL, то массивами действительно быстрее, но попробуй подцепить какой-нибудь DBGrid к "Query" просто для просмотра.


Ильш   (2004-10-19 11:09:00) [12]

на форум sql.ru сходжи там задай свой вопрос
ато здесь уже не обсуждение, а кидание кочерыжками.. :(


Anatoly Podgoretsky   (2004-10-19 11:02:00) [13]

ЮЮ ©   (19.10.04 10:28) [30]
Нельзя, массив то все равно надо заполнить, так что и .Next оставить и заполнение массива.


DenK_vrtz   (2004-10-19 11:00:00) [14]

Столько хорошего и дельного было сказано автору ветки...
Но мы ж настырные и не ищем легких(правильных) путей!

"Чего тут думать, трясти надо!"


Anatoly Podgoretsky   (2004-10-19 10:56:00) [15]

Fedia ©   (19.10.04 08:40) [12]
(уже не могу это писать без смеха :))

Не отчаивайся ты не один


Sergey13   (2004-10-19 10:54:00) [16]

2Fedia ©
Если ты не можешь влиять на структуру БД, то может стОит подумать о переносе логики на сервер? Тут 2 варианта.
1. Попробовать трехзвенку. На сервере приложений (стоящем вместе с БД) крутить такие затратные алгоритмы, а клиенту отдавать только результаты.
2. Хранимые процедуры - говорят они то-ли уже есть, то-ли вот-вот появятся в MySQL.

ЗЫ: Говорить что квери фигня и не знать, что такое есть фетчинг - признак нехороший.


Fedia   (2004-10-19 10:50:00) [17]

Nikolay M. ©   (19.10.04 10:37) [34]
Да я понимаю, что " В Москве" не сильный аргумент, но БД получилась вполне адекватной большинству решаемых задач (это далеко не только мое мнение). Может быть разрабатывали ее и студенты, но принимали ее и корректировали уже специалисты.

ЮЮ ©   (19.10.04 10:41) [36]
организуйте цикл по любому массиву, длиной 778112, не делая ничего внутри цикла и сравните с 0.3 секундами.

Всем до завтра.


Nikolay M.   (2004-10-19 10:49:00) [18]


> Johnmen ©   (19.10.04 10:42) [37]

Про студентов-то? Не то слово :-(
Какая разница, какой будет результат, если откаты уже сделаны, деньги выделены и распределены. Создать ИМБУРДЕ (ИМитацияБУРнойДЕятельности), написать отчеты о проделанной работе, студенту что-то наклепать - все довольны :(


asp   (2004-10-19 10:47:00) [19]

Fedia © > Кстати, посмотри VarArrayCreate, VarArrayLock, VarArrayUnlock...


Johnmen   (2004-10-19 10:42:00) [20]

>Nikolay M. ©   (19.10.04 10:37) [34]

По поводу разработки - действительность именно такова...


Страницы:   1 2 3

Наверх

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