Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


}|{yk ©   (2004-05-06 11:49:00) 

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

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, но вот если объектов будет много? Оптимален ли этот вариант решения или можно усовершенствовать?


}|{yk   (2004-05-06 12:28:00) [1]

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо