Главная страница
    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.45 MB
Время: 0.058 c
1-1155652862
sdf13
2006-08-15 18:41
2006.09.24
немецкий текст.


2-1157189467
nikv
2006-09-02 13:31
2006.09.24
Текущая директория


4-1141971209
balepa
2006-03-10 09:13
2006.09.24
Процессы и сокеты


2-1157531619
webpauk
2006-09-06 12:33
2006.09.24
как определить в каком столбце DBGrid юзер кликнул мышью?


15-1157041214
Sam Stone
2006-08-31 20:20
2006.09.24
TNSListner





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский