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

Вниз

Оптимизация процедуры построения дерева в 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.022 c
8-1079181398
Kreon
2004-03-13 15:36
2004.05.30
Как создать на одной форме два разных canvas a?


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


14-1083935165
Mim1
2004-05-07 17:06
2004.05.30
Где взять клиент для этого форума


1-1084966802
DN
2004-05-19 15:40
2004.05.30
УКАЗАТЕЛИ...


1-1084619254
DimonNew
2004-05-15 15:07
2004.05.30
передача свойст объектов в качестве параметров процедуры