Текущий архив: 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.45 MB
Время: 0.044 c