Главная страница
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.043 c
1-1127969777
AngelOKES
2005-09-29 08:56
2005.10.23
Экспорт в Excel тремя способами


4-1124693132
Pazitron_Brain
2005-08-22 10:45
2005.10.23
Программирование Железа


3-1126085667
2bj
2005-09-07 13:34
2005.10.23
переход фокуса между компонентами на DBCtrlGrid-е


2-1127483114
FBI Agent
2005-09-23 17:45
2005.10.23
Создание SQL таблиц?


3-1126270174
Alex Kryuchkov
2005-09-09 16:49
2005.10.23
[Microsoft][ODBC Driver Manager] Function sequence error