Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.034 c
15-1156092579
Юрий Зотов
2006-08-20 20:49
2006.09.24
И снова о демократии на "Мастаках" о:)


15-1157368429
REA
2006-09-04 15:13
2006.09.24
Играем в ГИБДД


3-1153653469
londinium
2006-07-23 15:17
2006.09.24
IBX и DeleteSQL()


15-1157610374
Stexen
2006-09-07 10:26
2006.09.24
VS2005


15-1157389775
RaZ
2006-09-04 21:09
2006.09.24
Сделать полезную программу.