Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Вниз

Проблемы со скоростью обработки TQuery записей из базы данных   Найти похожие ветки 

 
MikeFW   (2002-06-21 10:31) [0]

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

Есть 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)?


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

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


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

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


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


Необходимые действия - это построение дерева в 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);



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

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);


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

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


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

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


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

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


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

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

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

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

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


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

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

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


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


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

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


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

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


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.012 c
14-47671
lipskiy
2002-06-13 19:56
2002.07.15
UBPFD - бесплатная база готовых решений для Delphi


3-47202
MWM
2002-06-19 18:36
2002.07.15
Редактирование таблицы DBGrid


1-47600
nimble
2002-06-27 06:22
2002.07.15
Глюк


1-47355
MsGuns
2002-06-27 15:27
2002.07.15
Не хватает Борланд. и Виндузных иконок


6-47628
нету логина...
2002-05-02 20:42
2002.07.15
TSocket... надо передать Canvas по сети... ПОМОГИТЕ!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский