![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация процедуры построения дерева в 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]пример из "Мир Интербейз"...
индексы используются.. что еще надо? Только практика покажет и современный бекап/ресторе для поддержания индексов в актуальном состоянии