2016-09-28 3 views
0

У меня есть хранимая процедура ниже, и это, в основном, хранимая процедура, которая очищает таблицу в зависимости от даты обновления, теперь моя проблема в том, что моя хранимая процедура работает отлично, но как a develoer, я больше сосредоточусь на optminzing и не использую неправильную synta,Оптимизация приведенной ниже хранимой процедуры в oracle

так попросите вас, пожалуйста, посоветуйте и посоветуйте, если ниже хранится процедура. Я использую какой-либо неправильный синтаксис или как могу оптимизировать его ниже сохраненного prcedure, пожалуйста, сообщите поскольку я более убежден в оптимизации и эффективности, пожалуйста, советую.

create or replace procedure TABLE_CLEAN_UPABLE_CLEAN_UP 
is 
v_last_cleanup_time timestamp(6); 
v_last_mv_refresh_time timestamp(6); 
v_last_mv0_refresh_time timestamp(6); 
outcome VARCHAR2(100); 
i NUMBER := 0; 
begin 


Select LAST_START_DATE+LAST_RUN_DURATION into v_last_cleanup_time from USER_SCHEDULER_JOBS 
where JOB_NAME='DELTA_TABLE_CLEAN_UP_JOB';  

SELECT count(*) into i FROM all_mviews WHERE owner = 'XP_TM_TO' AND 
mview_name in ('CASHFLOW_VIEW', 'CASHFLOW_VIEW_0') and LAST_REFRESH_TYPE='COMPLETE' 
and CAST(LAST_REFRESH_DATE AS TIMESTAMP) > v_last_cleanup_time; 


if i=2 then 

SELECT CAST(LAST_REFRESH_DATE AS TIMESTAMP) into v_last_mv_refresh_time FROM all_mviews WHERE owner = 'XP_TM_TO' AND mview_name = 'CASHFLOW_VIEW' and LAST_REFRESH_TYPE='COMPLETE'; 
SELECT CAST(LAST_REFRESH_DATE AS TIMESTAMP) into v_last_mv0_refresh_time FROM all_mviews WHERE owner = 'XP_TM_TO' AND mview_name = 'CASHFLOW_VIEW_0' and LAST_REFRESH_TYPE='COMPLETE'; 

delete CASHFLOW_DELTA where (TRADE_ID,SOURCE_SYSTEM,TRADE_VERSION) 
    NOT in 
     (select table1.TRADE_ID,table1.SOURCE_SYSTEM,table1.TRADE_VERSION from CASHFLOW_DELTA table1 
       INNER JOIN (select TRADE_ID,SOURCE_SYSTEM,max(TRADE_VERSION) as MAX_TRADE_VERSION 
       from CASHFLOW_DELTA GROUP BY TRADE_ID, SOURCE_SYSTEM) table2 
       on table1.TRADE_ID=table2.TRADE_ID 
       where table1.SOURCE_SYSTEM=table2.SOURCE_SYSTEM 
       and table1.TRADE_VERSION=table2.MAX_TRADE_VERSION 
       and table1.BROKERAGE_REALISED='YES') 
       and createddate<v_last_mv_refresh_time 
       and createddate<v_last_mv0_refresh_time; 

end if;   
end; 
/
+1

Привет, я бы закрыть на 3 all_mviews до 1 запроса с футляром, когда находится в ЗЕЬЕСТЕ, то вам не нужно использовать 2 выбирает в IF – Thomas

+0

, если его не работает нормально, то нет вопрос о некорректном синтаксисе. Oracle не позволяет выполнить неправильный код синтаксиса. :-) – XING

+0

Томас, спасибо за ценные советы, я действительно ценю это, прошу вас, пожалуйста, показать бит, чтобы он мог схватить больше – sss

ответ

0
CREATE OR REPLACE PROCEDURE TABLE_CLEAN_UPABLE_CLEAN_UP 
IS 
    v_last_mv_refresh_time TIMESTAMP (6); 
    i       NUMBER := 0; 
BEGIN 
    SELECT MIN(CAST (LAST_REFRESH_DATE AS TIMESTAMP)), COUNT (*) 
    INTO v_last_mv_refresh_time,i 
    FROM all_mviews 
    WHERE owner = 'XP_TM_TO' 
     AND mview_name IN ('CASHFLOW_VIEW', 'CASHFLOW_VIEW_0') 
     AND LAST_REFRESH_TYPE = 'COMPLETE' 
     AND CAST (LAST_REFRESH_DATE AS TIMESTAMP) > (SELECT LAST_START_DATE + LAST_RUN_DURATION FROM USER_SCHEDULER_JOBS WHERE JOB_NAME = 'DELTA_TABLE_CLEAN_UP_JOB'); 


    IF i = 2 THEN 
     DELETE CASHFLOW_DELTA 
     WHERE ((TRADE_ID, SOURCE_SYSTEM, TRADE_VERSION) NOT IN (SELECT TRADE_ID, SOURCE_SYSTEM, MAX (TRADE_VERSION) AS MAX_TRADE_VERSION 
                    FROM CASHFLOW_DELTA 
                   GROUP BY TRADE_ID, SOURCE_SYSTEM) 
       OR NVL(BROKERAGE_REALISED,'NO') <> 'YES') 
     AND createddate < v_last_mv_refresh_time; 
    END IF; 
END; 
/
+0

Спасибо Motor's за ваши усилия также, пожалуйста, сообщите, что вы минимизировали условие цикла. Спасибо заранее. – sss

+0

Для этого нужно знать, что значит BROKERAGE_REALISED = 'YES' – Mottor

+0

CASFLOW_VIEW использует CASHFLOW_DELTA? Или DELTA_TABLE_CLEAN_UP_JOB использует его? – Mottor

Смежные вопросы