![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EXECUTE STATEMENT [D7, Firebird v1.5.3.4870]
PEAKTOP © (2006-07-20 11:48:00)Задача:
Есть таблицы
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формирует план запроса каждый раз перед выполнением, а также вообще не использует индексы ? Или отчего такие тормоза ?
Romkin (2006-07-20 13:52:00) [1]Права пользователя перекрывают. Вот если у пользователя такого права нет - смотрятся права процедуры
PEAKTOP (2006-07-20 13:17:00) [2]Спасибо .
Кстати, туда же
если используется конструкция EXECUTE STATEMENT, нужны ли права доступа вызывающей процедуре на вызываемую таблицу (просмотр, процедуру), или достаточно иметь права пользователю ?
Desdechado (2006-07-20 12:33:00) [3]План - каждый раз. Индексы - как любой запрос, по необходимости.
Процедура же уже препарирована и план на нее формируется 1 раз.