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

Вниз

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

 
Андрей Жук ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.036 c
9-1117807991
D-Man
2005-06-03 18:13
2005.10.23
глюк с TGA в OpenGL


14-1127374560
Kolan
2005-09-22 11:36
2005.10.23
Как найти утечку память с помощью MemProof


2-1127653086
Vitaliy
2005-09-25 16:58
2005.10.23
Комментарии и их последствия


2-1127907181
Гость22
2005-09-28 15:33
2005.10.23
Как не дать закрыть свое приложение?


2-1127504501
ForsXT
2005-09-23 23:41
2005.10.23
Звук





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский