Главная страница
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.47 MB
Время: 0.039 c
2-1157438380
nstur
2006-09-05 10:39
2006.09.24
Как определить размер текста в TMemo


15-1157204680
PSPF2003
2006-09-02 17:44
2006.09.24
Монитор


3-1153748023
DelphiLexx
2006-07-24 17:33
2006.09.24
TDBGridEh и checkbox ы


1-1155388106
apic
2006-08-12 17:08
2006.09.24
TListView


2-1157130201
nordic3
2006-09-01 21:03
2006.09.24
Код цвета