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

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

Проблемы со скоростью обработки TQuery записей из базы данных [D6, MSSQL]


MikeFW ©   (2002-06-21 10:31:00) 

Уважаемые Мастера,
у меня следующая проблема:

Есть 4 таблицы в базе данных MS SQL (800, 20.000, 80.000, 320.000 записей соответсвенно),
соединенные между собой последовательно.
В своем приложении я для работы с ними использую компоненты TQuery.
Мне необходимо пройти каждую запись во всех таблицах и для этого
я использую следующий цикл:

while not Query1.Eof do
begin
... // необходимые действия
Query2.First;
while not Query2.Eof do
begin
... // необходимые действия
Query3.First;
while not Query3.Eof do
begin
... // необходимые действия
Query4.First;
while not Query4.Eof do
begin
... // необходимые действия
Query4.Next;
end;
Query3.Next;
end;
Query2.Next;
end;
Query1.Next;
end;

Но только на прохождение одной ветки (одной записи по Query1)
программа затрачивает 3,5 минуты! (т.е. на все записи уйдет 46 часов!!!)
Но такое положение вещей недопустимо для меня!

Подскажите, пожалуйста, как можно ускорить данную операцию
по просмотру всех записей, причем значительно (хотябы раз в 100)?


Desdechado   (2002-06-22 16:31:00) [1]

а вообще treeview ОЧЕНЬ тормознутый компонент, жрет много ресурсов. более 1000 элементов влазит в него с трудом. попробуй найти интерфейсную замену.


MikeFW   (2002-06-21 12:07:00) [2]

Спасибо всем за помощь,
думаю, что теперь я смогу разобраться.


Val   (2002-06-21 11:53:00) [3]

Вот еще полезная ссылочка:
http://www.delphikingdom.com/helloworld/dbtreeview.htm


Turalyon   (2002-06-21 11:52:00) [4]

т.е. мне надо строить первый уровень по первой таблице, запомнив в Data ID записи для коннекта последующего уровня,
а при клике на узел, я пиш SQL запрос, связывающий первую таблицу со второй.

Я правильно все понял?


Да правильно.


MikeFW   (2002-06-21 11:50:00) [5]

т.е. мне надо строить первый уровень по первой таблице, запомнив в Data ID записи для коннекта последующего уровня,
а при клике на узел, я пиш SQL запрос, связывающий первую таблицу со второй.

Я правильно все понял?

и можно попросить еще кусочек кода реализующий следующее:

> Далее при обработке Expand добавляй данные из из QUERY2 ...
> читай из 2-й таблицы (построй SQL запрос) и добавляй к дереву только записи относящиеся к данному узлу ...


Val   (2002-06-21 11:48:00) [6]

добавлю: объявите статические поля в квери, где это возможно - не будет поиска поля по имени; не используйте .Value, сами приводите к нужному типу через As...


Turalyon   (2002-06-21 11:42:00) [7]

Для того чтобу к тебя небыло таких тормозов не читай в TreeView сразу все данные... это не правильно...
Считывай только то что пользователь выбирает...
То есть с начала прочитай данные из первой таблицы и добавь к дереву... когда пользователь кликнет мышю на ветвь читай из 2-й таблицы (построй SQL запрос) и добавляй к дереву только записи относящиеся к данному узлу... и так далее.
Таким же макаром посмтроен Regedit..
Иначе не хватит ни какой памяти и никакого проца...


ПИТОН   (2002-06-21 11:40:00) [8]

Зачем такие сложности как обход всего дерева при построении дерева?
Сначала делай дерево, состоящее из полей QUERY1. К каждому полю добавляе пустой итем.
Далее при обработке Expand добавляй данные из из QUERY2 и т.д.
По-моему будет гораздо быстрее.


MikeFW   (2002-06-21 11:35:00) [9]

P.S. Небольшое уточнение кода

// необходимое действие в первом цикле
Node := TreeView1.Items.Add(nil, Query1.FieldByName("INVTYPEID").Value);

// необходимое действие во втором цикле
Node1 := TreeView1.Items.Add(Node, Query2.FieldByName("INVKINDID").Value);

// необходимое действие в третьем цикле
New(MyRecPtr);
MyRecPtr^.FName := Query3.FieldByName("DIMENSION5_").Value;
TreeView1.Items.AddChildObject(Node1, Query3.FieldByName("ITEMNAME").Value, MyRecPtr);


MikeFW   (2002-06-21 11:32:00) [10]


Необходимые действия - это построение дерева в TreeView, с запоминанием дополнительных данных в Data

вот код:

// необходимое действие в первом цикле
Node := TreeView1.Items.Add(nil, qType.FieldByName("INVTYPEID").Value);

// необходимое действие во втором цикле
Node1 := TreeView1.Items.Add(Node, qPrice.FieldByName("INVKINDID").Value);

// необходимое действие в третьем цикле
New(MyRecPtr);
MyRecPtr^.FName := qItem.FieldByName("DIMENSION5_").Value;
TreeView1.Items.AddChildObject(Node1, qItem.FieldByName("ITEMNAME").Value, MyRecPtr);


Val   (2002-06-21 11:29:00) [11]

полностью согласен с fnatali © (21.06.02 11:09)
странные происходят "необходимые действия" для клиент-сервера.
Просветите нас, пожалуйста, что же вы делаете?


fnatali   (2002-06-21 11:09:00) [12]

расшифруй, что такое "/необходимые действия". Может их можно выполнять не пробегая по Query, а используя SQL-запрос или вообще оформить хранимую процедуру?


Наверх

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