Текущий архив: 2002.07.15;
Скачать: CL | DM;
ВнизПроблемы со скоростью обработки 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;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.012 c