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

Вниз

Оптимизация процедуры построения дерева в FireBird 1.5   Найти похожие ветки 

 
}|{yk ©   (2004-05-06 11:49) [0]

Имеются таблицы

CREATE TABLE UNIT (
   MEM_ID       IDENTIFIER NOT NULL,
   MEM_NAME     VARCHAR(40) NOT NULL,
   MEM_DESC     VARCHAR(255),
   MEM_TYPE     VARCHAR(1) NOT NULL,
   CURR_ID      IDENTIFIER NOT NULL,
   ELIM_STATUS  VARCHAR(1),
   GROUP_ID     IDENTIFIER NOT NULL,
   MEM_ORDER    INTEGER NOT NULL
);

CREATE TABLE UNIT_SET (
   SET_ID    IDENTIFIER NOT NULL,
   SET_NAME  VARCHAR(40) NOT NULL,
   SET_DESC  VARCHAR(255)
);

CREATE TABLE UNIT_TREE (
   SET_ID           IDENTIFIER NOT NULL,
   MEM_ID           IDENTIFIER NOT NULL,
   MEM_PID          INTEGER NOT NULL,
   MEM_ORDER        INTEGER NOT NULL,
   MEM_CONSOLIDATE  BOOLEAN DEFAULT "Y" NOT NULL
);

/* Check constraints definition */

ALTER TABLE UNIT ADD CONSTRAINT CHK_UNITMEM_ID CHECK (MEM_ID > -1);
ALTER TABLE UNIT ADD CONSTRAINT CHK_UNITMEM_TYPE CHECK (MEM_TYPE IN ("C", "R"));
ALTER TABLE UNIT ADD CONSTRAINT NN_UNITCURR_ID CHECK ("CURR_ID" IS NOT NULL);
ALTER TABLE UNIT ADD CONSTRAINT NN_UNITMEM_NAME CHECK ("MEM_NAME" IS NOT NULL);
ALTER TABLE UNIT ADD CONSTRAINT NN_UNITMEM_TYPE CHECK ("MEM_TYPE" IS NOT NULL);
ALTER TABLE UNIT_SET ADD CONSTRAINT NN_UNIT_SETSET_NAME CHECK ("SET_NAME" IS NOT NULL);
ALTER TABLE UNIT_TREE ADD CONSTRAINT CHK_UNIT_TREEMEM_CONSOLIDATE CHECK (MEM_CONSOLIDATE IN ("Y", "N"));
ALTER TABLE UNIT_TREE ADD CONSTRAINT NN_UNIT_TREEMEM_CONSOLIDATE CHECK ("MEM_CONSOLIDATE" IS NOT NULL);
ALTER TABLE UNIT_TREE ADD CONSTRAINT NN_UNIT_TREEMEM_ORDER CHECK ("MEM_ORDER" IS NOT NULL);
ALTER TABLE UNIT_TREE ADD CONSTRAINT NN_UNIT_TREEMEM_PID CHECK
("MEM_PID" IS NOT NULL);

Процедура построения любого поддеререва
CREATE PROCEDURE GET_SUB_TREE (
   INSET_ID INTEGER,
   INMEM_PID INTEGER,
   INLEVEL INTEGER)
RETURNS (
   MEM_PID INTEGER,
   MEM_ID INTEGER,
   OUTLEVEL INTEGER,
   IS_LEAF INTEGER)
AS
declare variable ChildID integer;
begin
for select a.MEM_ID from UNIT_TREE a
 where a.MEM_PID = :InMEM_PID and a.set_id=:inset_id
 into :ChildID
do
begin
 MEM_PID = :InMEM_PID;
 MEM_ID = :ChildID;
 OutLevel = :InLevel + 1;
 if (exists(select 1 from unit_tree a where
 a.set_id=:inset_id and a.mem_pid=:mem_id))then
 IS_LEAF=0;
  else
  IS_LEAF=1;
 Suspend;
 for select MEM_ID, OUTLEVEL, MEM_PID,IS_LEAF from get_sub_tree
      (:inset_id,:MEM_ID,  :OutLevel)
   into :MEM_ID, :OutLevel, :MEM_PID,:is_leaf
  do
    Suspend;
end
end
План получается такой
PLAN (A INDEX (UNIT_TREE_PARENT,FK_UNIT_TREESET_ID))(A INDEX (UNIT_TREE_PARENT,FK_UNIT_TREESET_ID))

Насколько быстро она будет работать на больших объемах данных?
А то у меня дерево пока из 250 объектов, строится за 15 ms, но вот если объектов будет много? Оптимален ли этот вариант решения или можно усовершенствовать?


 
Соловьев ©   (2004-05-06 12:18) [1]

пример из "Мир Интербейз"...
индексы используются.. что еще надо? Только практика покажет и современный бекап/ресторе для поддержания индексов в актуальном состоянии


 
}|{yk ©   (2004-05-06 12:28) [2]

Кстати пример из мир интербез у меня не пошел - появилась ошибка конкурирующих запросов



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

Форум: "Базы";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.031 c
14-1084456596
Developerr
2004-05-13 17:56
2004.05.30
Как получить только имя файла в OpenDialog?


8-1079261589
Evrp
2004-03-14 13:53
2004.05.30
Пожалуйста помогите!!! Не передвигаеться канва у TImage


9-1075736940
Igoryok
2004-02-02 18:49
2004.05.30
Зарисовка области по точкам соединённых кривыми


6-1081931225
Makhanev A.S.
2004-04-14 12:27
2004.05.30
Sockets: SysError, code = 1400...


14-1084382180
NailMan
2004-05-12 21:16
2004.05.30
Че-то запутался с приведением к типу... :-(





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