220 likes | 431 Views
Оптимизация хранимых условий отбора. Миндияров Илья Главный специалист Центра информационных технологий и консалтинга ПАРУС mindiyarov@parus.ru. Хранимые условия отбора.
E N D
Оптимизация хранимых условий отбора Миндияров Илья Главный специалист Центра информационных технологий и консалтинга ПАРУС mindiyarov@parus.ru
Хранимые условия отбора Для пользователей, которым надо манипулировать несколькими типовыми комбинациями условий отбора, предлагается альтернативный механизм, называемый хранимыми условиями отбора. Он доступен во всех приложениях Системы в большинстве разделов. Суть этого механизма в том, что пользователь имеет возможность заранее подготовить для каждого раздела Системы любое количество типовых условий отбора. ПРОБЛЕМА1: Медленная работа хранимых условий отбора. ПРОБЛЕМА2: Нет возможности выполнить процедуру PL/SQL, для реализации сложной логики. РЕШЕНИЕ1: Ждать реализации условий отбора в разделе через PKG_COND_BROKER РЕШЕНИЕ2: Установить проектное решение из этой презентации
Пример использования Система контроля учетных данных Пример папок отбора
Вопросы рассматриваемые в презентации Ускорение работы хранимых условий отбора Для получения текста программ нажмитеправой кнопкой мыши на объекте “Hru.zip” выберите “Копировать”, а затем в проводнике нажмите правую кнопку мыши и выберите “Вставить”.
Оптимизация хранимых условий отбора ВАЖНО! После выполнения скрипта из Hru.zip будет заменен штатный объект F_CONDFOLDERS_WHERE_CLAUSE Теперь при написании запросов станут доступны следующие конструкции /*rawsql*/ - при добавлении условия не будут добавляться “ in (…)” /*proc … proc*/ - перед выполнением запроса будет выполнена процедура PL/SQL
Пример использования В модуле “Администратор”“Словари”->”Хранимые условия отбора”->”Таблицы отбора”
Пример использования Выполняем действие “Генерация состава”
Пример использования В модуле “Администратор”“Словари”->”Хранимые условия отбора”->”Схемы отбора”
Пример использования Выбираем действие “Папки…”
Пример использования Добавляем папку “_В месяце
Пример использования Добавляем папку “_Текущий расчет”
Пример использования Создадим функции create or replace function UDO_F_SLCALCWAGES_CALCMONTH return number is begin return PKG_SLCALCWAGES.CALCMONTH; end; / grant execute on UDO_F_SLCALCWAGES_CALCMONTH to public / create or replace function UDO_F_SLCALCWAGES_CALCYEAR return number is begin return PKG_SLCALCWAGES.CALCYEAR; end; / grant execute on UDO_F_SLCALCWAGES_CALCYEAR to public / create or replace function UDO_F_SLCALCWAGES_CALCULATION return number is begin return PKG_SLCALCWAGES.CALCULATION; end; / grant execute on UDO_F_SLCALCWAGES_CALCULATION to public /
Пример использования В модуле “Расчет зарплаты”“Функции”->”Расчет зарплаты” перейдем на вкладку “Папки”
Пример использования Запустим “Монитор SQL-запросов”
Пример использования Узнаем как называется (какой имеет псевдоним) главное представление раздела select V_CLNPSPFM.*, F_CLNPSPFM_GET_CHARGE(NCOMPANY, NRN) N78928, F_CLNPSPFM_GET_RETAIN(NCOMPANY, NRN) N78929, F_CLNPSPFM_GET_OVERPAY(NCOMPANY, NRN) N78930, F_CLNPSPFM_GET_PAY(NCOMPANY, NRN) N78931, F_CLNPSPFM_GET_GRWAGES(NCOMPANY, NRN) N78932, F_CLNPSPFM_GET_RATE(NCOMPANY, NRN) N78933, substr(F_CLNPSPFM_GET_SCHEDULE(NCOMPANY, NRN), 1, 240) S78934, substr(F_CLNPSPFM_GET_SLCOSTS(NCOMPANY, NRN), 1, 240) S78935 from V_CLNPSPFM where nCOMPANY = :A$COMPANY order by SSURNAME, DBEGENG В нашем случае псевдонима нет – представление так и называется V_CLNPSPFM
Пример использования Возвращаемся в модуль “Администратор” и у папки “_В месяце” нажимаем на кнопку “Запрос”
Пример использования Возвращаемся в модуль “Администратор” и у папки “_В месяце” нажимаем на кнопку “Запрос” В начале запроса вставим /*rawsql*/ - это позволит нам использовать existsвместо in (…)
Пример использования Результат: select V_CLNPSPFM.*, F_CLNPSPFM_GET_CHARGE(NCOMPANY, NRN) N78928, F_CLNPSPFM_GET_RETAIN(NCOMPANY, NRN) N78929, F_CLNPSPFM_GET_OVERPAY(NCOMPANY, NRN) N78930, F_CLNPSPFM_GET_PAY(NCOMPANY, NRN) N78931, F_CLNPSPFM_GET_GRWAGES(NCOMPANY, NRN) N78932, F_CLNPSPFM_GET_RATE(NCOMPANY, NRN) N78933, substr(F_CLNPSPFM_GET_SCHEDULE(NCOMPANY, NRN), 1, 240) S78934, substr(F_CLNPSPFM_GET_SLCOSTS(NCOMPANY, NRN), 1, 240) S78935 from V_CLNPSPFM where /*rawsql*/ exists (select null from v_slpays_shadow s where s.nclnpspfm=v_clnpspfm.nrn and S.NMONTH = UDO_F_SLCALCWAGES_CALCMONTH and S.NYEAR = UDO_F_SLCALCWAGES_CALCYEAR ) and nCOMPANY = :A$COMPANY order by SSURNAME, DBEGENG
Пример использования Для папку “_Текущий расчет” условие будет /*rawsql*/ exists ( select null from v_slpays_shadow s where s.nclnpspfm=v_clnpspfm.nrn and S.NSLCALCULAT = UDO_F_SLCALCWAGES_CALCULATION )
Пример использования Реализация сложного отбора с помощью процедуры PL/SQL
Пример использования Реализация сложного отбора с помощью процедуры PL/SQL Вставляем комментарий вида /*proc begin … end; proc*/