아래 처럼 parallel dml 주고,
nologging으로 했는데도 속도에 변화가 없는데..
어떻게 하면 조금 빨라질 수 있을까요?
감사합니다 ㅠ
1. a 와 b 를 아우터 조인 한 뒤 b 에 Where 조건을 주면 - 아우터 조인이 무의미해 집니다. 2. 일자와 시간을 묶어 검색하면 인덱스를 못탑니다. - 일자 조건만 가지고 인덱스를 타도록 유도해보세요 3. 각 조건별로 따로 나누어 조회하여 합치지 마시고 - 한번에 조회하여 나누는 방식으로 하세요. 4. 개선 후 쿼리에선 아예 빠진 부분이지만 개선전 쿼리에서의 소소한 문제점 - COUNT(컬럼) 은 비효율입니다. COUNT(*) 하세요. - UNION 은 비효율입니다. UNION ALL 하세요.
SELECT '20140319' sikdate , pernr , work_name , COUNT(DECODE(gb, 1, 1)) moncnt , COUNT(DECODE(gb, 1, 1)) * 1000 monpay , SUBSTR(MIN(DECODE(gb, 1, regi_time)), 1, 4) montm , COUNT(DECODE(gb, 2, 1)) aftcnt , COUNT(DECODE(gb, 2, 1)) * 1000 aftpay , SUBSTR(MIN(DECODE(gb, 2, regi_time)), 1, 4) afttm , COUNT(DECODE(gb, 3, 1)) evecnt , COUNT(DECODE(gb, 3, 1)) * 1000 evepay , SUBSTR(MIN(DECODE(gb, 3, regi_time)), 1, 4) evetm , COUNT(DECODE(gb, 4, 1)) nigcnt , COUNT(DECODE(gb, 4, 1)) * 1000 nigpay , SUBSTR(MIN(DECODE(gb, 4, regi_time)), 1, 4) nigtm FROM (SELECT a.pernr, b.work_name, a.regi_time , CASE WHEN a.regi_date||a.regi_time >= '20140319060000' AND a.regi_date||a.regi_time <= '20140319090000' THEN 1 WHEN a.regi_date||a.regi_time >= '20140319110000' AND a.regi_date||a.regi_time <= '20140319130000' THEN 2 WHEN a.regi_date||a.regi_time >= '20140319170000' AND a.regi_date||a.regi_time <= '20140319210000' THEN 3 WHEN a.regi_date||a.regi_time >= '20140319230000' AND a.regi_date||a.regi_time <= '20140320030000' THEN 4 END AS gb FROM from food001 a INNER JOIN Basic002 b ON a.term_id = b.Term_id WHERE b.work_name = '대전' AND a.regi_date >= '20140319' AND a.regi_date <= '20140320' AND a.regi_date||a.regi_time >= '20140319060000' AND a.regi_date||a.regi_time <= '20140320030000' ) WHERE gb IS NOT NULL GROUP BY pernr, work_name ;
정말 감사드립니다!
많은 공부가 되었습니다!
좋은 하루 보내세요~!!
마농님 그런데 한가지 더 여쭤볼게 있습니다
append paraller 과 nologging을 준 이유가
아카이브를 최대한 안쌓이게 하려고 준 것인데..
마농님이 개선해주신 것에 다시 nologging과 append parallel을 주면
아카이브가 눈이 보이게 주는게 될까요~?
감사합니다!
저는 Select 구문만 개선해 드린 것입니다. Insert 는 별개로 접근하셔야 합니다. parallel 과 nologging 또한 각각 별개의 관점으로 접근하셔야 합니다. 각각의 사용법과 제약사항을 확인해 보시고 제대로 사용했는지 확인해 보세요.