Главная страница
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.056 c
4-1124416633
Kripton
2005-08-19 05:57
2005.10.23
Прозрачность в TglListBox (class(TCustomListBox))


14-1128154494
Andy BitOff
2005-10-01 12:14
2005.10.23
Порты 1010-1013


2-1128343256
Vladimir88
2005-10-03 16:40
2005.10.23
TreeView


2-1127749588
erika
2005-09-26 19:46
2005.10.23
fb


4-1123753973
Pasha83
2005-08-11 13:52
2005.10.23
Перезагрузка и выключение