Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

Покритикуйте   Найти похожие ветки 

 
Андрей Жук ©   (2005-10-04 15:16) [0]

Универсальная функция построения дерева в Firebird 1.5

CREATE PROCEDURE GET_TREE (
   INMEM_PID INTEGER,
   INLEVEL INTEGER,
   TABLE_NAME CHAR(32),
   COLUMNID_NAME CHAR(32),
   COLUMNPID_NAME CHAR(32))
RETURNS (
   MEM_PID INTEGER,
   MEM_ID INTEGER,
   OUTLEVEL INTEGER,
   IS_LEAF INTEGER)
AS
DECLARE VARIABLE CHILDID INTEGER;
DECLARE VARIABLE L_IS_LEAF INTEGER;
DECLARE VARIABLE SEQUEL VARCHAR(1024);
begin
SEQUEL = "select a."||:COLUMNID_NAME||" from " || :table_name || " a where a." || :columnpid_name || " = " || :InMEM_PID;
for EXECUTE STATEMENT SEQUEL into :ChildID
do
begin
 MEM_PID = :InMEM_PID;
 MEM_ID = :ChildID;
 OutLevel = :InLevel + 1;
 SEQUEL = "select count(1) from "||TABLE_NAME||" where "||:COLUMNID_NAME||"="||:mem_id;
 EXECUTE STATEMENT SEQUEL INTO :l_is_leaf;
 if (L_IS_LEAF=0) then
 IS_LEAF=0;
  else
  IS_LEAF=1;
 Suspend;
 for select MEM_ID, OUTLEVEL, MEM_PID,IS_LEAF from GET_TREE
      (:MEM_ID,  :OutLevel, :table_name, :columnid_name, :columnpid_name)
   into :MEM_ID, :OutLevel, :MEM_PID,:is_leaf
  do
    Suspend;
end
end


 
Sergey_Masloff   (2005-10-04 15:31) [1]

>SEQUEL = "select count(1) from "||TABLE_NAME||" >where "||:COLUMNID_NAME||"="||:mem_id;
> EXECUTE STATEMENT SEQUEL INTO :l_is_leaf;
В лом проверять, посмотри сравнение с параметризованным "статическим" SQL по скорости. Должен дикие тормоза поиметь на нормальных данных. Оптимизатору ж каждый раз придется заново парсить команду. А на такого прода запросах на разбор и уходит 90% времени.


 
Андрей Жук ©   (2005-10-04 15:36) [2]

не знаю, 6-уровневое дерево из 300 эл-том строится за 765ms на Cel-1333.
Специальная процедура для такого же дерева (для одной таблицы)(используется в настоящее время) исполняется 234ms.


 
Sergey_Masloff   (2005-10-04 15:40) [3]

Ну то есть в 2.5 раза тормознее ;-)
Если скорость приемлемая то почему и нет?


 
Андрей Жук ©   (2005-10-04 15:45) [4]

А если убрать параметр IS_LEAF то запрос будет выполняться 515ms


 
Sergey_Masloff   (2005-10-04 16:06) [5]

Что-то медленно у тебя "статический" работает. Я сейчас посмотрел у меня 17-уровневое дерево 25000 элементов строится 1016 ms. 4-х уровневое 400 записей 15 ms. Никаких извивов все "в лоб" просто рекурсивный обход.
Может ты не то меряешь?
 
В любом случае повторю - если визуальных тормозов нет то вполне нормально. ИМХО все что до 1 секунды имеет право на жизнь ;-)


 
Igorek ©   (2005-10-04 18:42) [6]

> ИМХО все что до 1 секунды имеет право на жизнь ;-)
Все что можно оптимизировать должно умереть.
--
Я не понял что делает данный код?


 
Андрей Жук ©   (2005-10-04 18:47) [7]

Строит дерево, которое элементарно загрузить в элемент отображения



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

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
6-1113090661
Максим
2005-04-10 03:51
2005.10.23
Тема письма


2-1127405723
GoodLud
2005-09-22 20:15
2005.10.23
OpenDialog расширение


1-1127906307
whatisthematrix1
2005-09-28 15:18
2005.10.23
Двухбайтовое Wide-кодирование


1-1128024783
lesee
2005-09-30 00:13
2005.10.23
Отбросить тень TLabel и получит её регион и регин


3-1126086628
DelphiN!
2005-09-07 13:50
2005.10.23
Загрузка процессора на 100% после select запроса