Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 раз.


Наверх

Титульная страница Поиск, карта сайта Написать письмо