Текущий архив: 2006.09.24;
Скачать: CL | DM;
ВнизEXECUTE STATEMENT Найти похожие ветки
← →
PEAKTOP © (2006-07-20 11:48) [0]Задача:
Есть таблицы
ACC - бухгалтерский план счетов
ID INTEGER NOT NULL - Код счета
NAME VARCHAR(255) - Название
PARENT_ID INTEGER - Код родительского счета
REL_NAME VARCHAR(50) - Название таблицы-справочника в базе данных, из котрой выбирается субконто проводки.
Например, для счетов 361,362, 631,632 субконто справочник Контрагенты, для счетов 661, 6611 субконто справочник Сотрудникии т.д. Все таблицы-справочники имеют поля ID и NAME.
<JRNL_CASH> - журнал кассовых документов
......
ACC_ID INTEGER NOT NULL REFERENCES ACC(ID) - Код счета из плана счетов
SUBKONTO_ID INTEGER - Код элемента субконто в справочнике
..........
Есть процедура JR_CASH
CREATE PROCEDURE JR_CASH(
.....
)RETURNS(
.....
ACC_ID INTEGER,
SUBKONTO_ID INTEGER,
SUBKONTO_NAME VARCHAR(255)
....
)
AS
DECLARE VARIABLE P_REL_NAME VARCHAR(50);
DECLARE VARIABLE P_SQL_STMT VARCHAR(255);
BEGIN
FOR
SELECT JR.ACC_ID, JR.SUBKONTO_ID, A.RELNAME
FROM JRNL_CASH JR, ACC A
WHERE (A.ID = JR.ACC_ID)
INTO :ACC_ID, :SUBKONTO_ID, :P_REL_NAME
DO
BEGIN
P_SQL_STMT = "SELECT FIRST 1 TB.NAME FROM "||:P_REL_NAME||" TB WHERE (TB.ID = "||:SUBKONTO_ID||") ";
FOR
EXECUTE STATEMENT :P_SQL_STMT INTO :SUBKONTO_NAME
DO
SUSPEND;
END
END
Проблема:
Процедура JR_CASH вызывает дикие тормоза даже на 20-30 документах за один день. При этом ее процедура-клон, в которой блок EXECUTE STATEMENT заменен на много-вложенную структуру IF(:ACC_ID IN (361,362, 631,632))THEN select from contragent ELSE IF (:ACC_ID IN (661, 6611)) THEN select from sotrudnik ELSE ...(вроде CASE в паскале) , занимающую три экрана, просто "улетает" на документах за полгода.
Вопрос
Получается, что EXECUTE STATEMENTформирует план запроса каждый раз перед выполнением, а также вообще не использует индексы ? Или отчего такие тормоза ?
← →
Desdechado © (2006-07-20 12:33) [1]План - каждый раз. Индексы - как любой запрос, по необходимости.
Процедура же уже препарирована и план на нее формируется 1 раз.
← →
PEAKTOP © (2006-07-20 13:17) [2]Спасибо .
Кстати, туда же
если используется конструкция EXECUTE STATEMENT, нужны ли права доступа вызывающей процедуре на вызываемую таблицу (просмотр, процедуру), или достаточно иметь права пользователю ?
← →
Romkin © (2006-07-20 13:52) [3]Права пользователя перекрывают. Вот если у пользователя такого права нет - смотрятся права процедуры
Страницы: 1 вся ветка
Текущий архив: 2006.09.24;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.058 c