아래와 같은 프로시져가 있습니다.
수행 속도가 5분정도 되어서 어디가 문제인지 여쭤보려합니다.
cusor_A의 데이터 갯수는 약 만개 정도이며
cusor_A에서 구한 데이터를 가지고 TMP_SQL를 array1 사이즈 4개를 수행하면 총 4만번정도 수행할거라 여겨집니다.
=> cursor_A, tmp_sql 쿼리 수행시간은 각각 5초,1초 내외입니다.
( tab1 테이블에 데이터가 좀 많긴 합니다. 5억건 정도)
전체 수행시간이 너무 시간이 오래걸립니다.
속도 향상 방법이 없을까요??
CREATE OR REPLACE PROCEDURE procedureA
IS
BEGIN
DECLARE
var1 VARCHAR2(100);
var2 VARCHAR2(100);
var3 NUMBER(10);
TMP_SQL VARCHAR2(4000);
TYPE COMPAREARRAY IS VARRAY(10) OF VARCHAR2(50);
array1 COMPAREARRAY;
array2 COMPAREARRAY;
CURSOR cusor_A IS
SELECT DISTINCT A.cols1, A.cols2, D.cols3, '201428' cols4
FROM tab1 A, tab2 D, tab3 G
WHERE 1 = 1
AND D.cols1 = A.cols1
AND D.cols5 = A.cols5
AND G.cols1 = A.cols1
AND G.cols2 = A.cols2
AND G.cols3 = D.cols3
AND A.cols1 = 'TEST'
AND A.cols6 = 'D'
AND A.cols7 BETWEEN '20140707' AND '20140713'
AND A.cols9 != 0
;
BEGIN
array1 := COMPAREARRAY('L','U','N','T');
array2 := COMPAREARRAY('E','B','M','A');
FOR BASE IN cusor_A
LOOP
FOR I IN array1.FIRST .. array1.LAST
LOOP
TMP_SQL := ' SELECT COUNT(*) AS CNT '||
' FROM ( '||
' SELECT A.cols10,(CASE '||
' WHEN A.cols11 = ''PID_'' || A.cols1 '||
' THEN ''TEST'' '||
' WHEN A.cols11 = ''PID_'' || A.cols1 '||
' THEN ''TEST'' '||
' ELSE ''SAMPLE'' '||
' END) AS GOOD '||
' FROM tab1 A, '||
' tab2 D, '||
' tab3 G '||
' WHERE 1 = 1 '||
' AND D.cols1 = A.cols1 '||
' AND D.cols5 = A.cols5 '||
' AND G.cols1 = A.cols1 '||
' AND G.cols2 = A.cols2 '||
' AND G.cols3 = D.cols3 '||
' AND A.cols1 = '''||BASE.cols1||''' '||
' AND A.cols2 = '''||BASE.cols2||''' '||
' AND D.cols3 = '''||BASE.cols3||''' '||
' AND A.cols10 = '''||array2(I)||''' '||
' AND A.cols6 = ''D'' '||
' AND A.cols7 BETWEEN ''201428'' AND ''201428'' '||
' AND A.cols9 != 0 '||
' ) A '||
' WHERE cols8 = '''||array1(I)||''' ';
EXECUTE IMMEDIATE TMP_SQL INTO var3;
var1 := array1(I);
var2 := array2(I);
IF var3 >=1 THEN
GOTO LABEL_INNER;
END IF;
END LOOP;
<<LABEL_INNER>>
NULL;
END LOOP;
END;
COMMIT;
END;
/
|