powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как можно ускорить такую функцию?
5 сообщений из 5, страница 1 из 1
как можно ускорить такую функцию?
    #33057900
yyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подскажите pls как можно переписать такую функцию - очень медленно работает (функция для получения всех "родителей" объекта в иерархии)

create table hierarchy (child int, parent int, part int);

CREATE OR REPLACE FUNCTION get_all_parents(v_child int) RETURNS SETOF HIERARCHY AS'
DECLARE
v_rowsadded INTEGER;
v_rec record;
BEGIN
execute ''create temp table tab_curr (ID int, PART int, FLAG int DEFAULT 0) ON COMMIT DROP;'';

execute ''insert into tab_curr select PARENT, PART, 0 from HIERARCHY where CHILD='' || v_child;

GET DIAGNOSTICS v_rowsadded = ROW_COUNT;

WHILE v_rowsadded > 0 LOOP
execute ''update tab_curr set FLAG = 1 where FLAG = 0'';
execute ''insert into tab_curr select h.PARENT, h.PART, 0 from HIERARCHY h, tab_curr tmp where h.CHILD=tmp.ID and tmp.FLAG = 1 and h.PART=tmp.PART'';
GET DIAGNOSTICS v_rowsadded = ROW_COUNT;
execute ''update tab_curr set FLAG = 2 where FLAG = 1'';
END LOOP;

FOR v_rec IN execute ''SELECT distinct ID, '' || v_part || '', PART FROM tab_curr'' LOOP
RETURN NEXT v_rec;
END LOOP;

execute ''drop table tab_curr'';
RETURN;
END;
'
language 'plpgsql';


заранее спасибо!
...
Рейтинг: 0 / 0
как можно ускорить такую функцию?
    #33057962
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если вот так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace function get_hierarchy( _id int ) returns setof hierarchy as $$
DECLARE
        _rec   hierarchy%ROWTYPE;
        _temp int;
BEGIN
    _temp := _id;
        while _temp is not null loop
            select into _rec *  from hierarchy where child = _temp;
            _temp := _rec.parent;
            return next _rec;
          end loop;
    return;
END
$$ language 'plpgsql';
...
Рейтинг: 0 / 0
как можно ускорить такую функцию?
    #33057982
yyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так не получится, т.к. child имеет много parent, т.е. при select * from hierarchy where child = _temp; получишь много записей
...
Рейтинг: 0 / 0
как можно ускорить такую функцию?
    #33058031
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дубль 2 :) :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace function get_parents( _id bigint ) returns setof hierarchy as $$
DECLARE
        _rec   hierarchy%ROWTYPE;
        _temp bigint;
        _r2    hierarchy%ROWTYPE;
BEGIN
    if _id is null then return; end if;
    _temp := _id;
    for _rec in select *  from hierarchy where child = _temp loop
            _temp := _rec.parent;
            return next _rec;
            for _r2 in select * from get_parents(_temp) loop
                return next _r2;
            end loop;
    end loop;
    return;
END
$$ language 'plpgsql';
...
Рейтинг: 0 / 0
как можно ускорить такую функцию?
    #33058108
yyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работает, большое спасибо!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как можно ускорить такую функцию?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]