2) 튜닝한 쿼리
튜닝 전 쿼리
SQL >
declare
1_수납금액 number;
begin
for c in (select 고객ID, sum(입금액) 입금액
from 은행입금내역
where to_char(입금일시, 'yyyymmdd') = '20210329'
group by 고객ID)
loop
begin
select 수납금액 into l_수납금액
from 수납
where 고객ID = c.고객ID
and 수납일자 = 20210329;
execute immediate
'update 수납 set 수납금액 = ' || c.입금액 ||
'where 고객ID = '|| c.고객ID ||
'and 수납일자 = 20210329';
exception
when no_data_found then
execute immediate
'insert into 수납(고객ID, 수납일자, 수납금액) values('
|| c. 고객ID || ', 20210329, ' || c. 입금액 || ')';
end;
commit;
end loop;
end;
튜닝 후 쿼리
SQL >
BEGIN
UPDATE 수납 A
SET A.수납금액 = ( SELECT SUM(입금액)
FROM 은행입금내역
WHERE 입금일시 >= TO_DATE('20210329','YYYYMMDD')
AND 입금일시 < TO_DATE('20210330','YYYYMMDD')
AND 고객ID = A.고객ID)
AND A.수납일자 ='20210329'
AND EXISTS ( SELECT 'X'
FROM 은행입금내역
WHERE 입금일시 >= TO_DATE('20210329','YYYYMMDD')
AND 입금일시 < TO_DATE('20210330','YYYYMMDD')
AND 고객ID = A.고객ID);
INSERT INTO 수납 (고객ID , 수납일자 , 수냡금액)
SELECT 고객ID , '20210329' , SUM(입금액)
FROM 은행입금내역 A
WHERE 입금일시 >= TO_DATE('20210329','YYYYMMDD')
AND 입금일시 < TO_DATE('20210330','YYYYMMDD')
AND NOT EXISTS (
SELECT 'X'
FROM 수납
WHERE 수납일자 = '20210329'
AND 고객ID = A.고객ID
)
GROUP BY 고객ID;
COMMIT;
END;
MERGE INTO 문으로 튜닝하기
SQL >
MERGE INTO 수납 R
USING ( SELECT 고객ID , sum(입금액) 입금액
FROM 은행입금내역
WHERE 입금일시 >= TO_DATE('20210329','YYYYMMDD')
AND 입금일시 < TO_DATE('20210330','YYYYMMDD')
GROUP BY 고객ID) A
ON (R.고객ID = A.고객ID AND R.수납일자 ='20210329')
WHEN MATCHED THEN UPDATE
SET R.수납금액 = A.입금액
WHEN NOT MATCHED THEN
INSERT (고객 ID , 수납일자 , 수납금액) VALUES ( A.고객ID , '20210329',A.입금액);
COMMIT;
[출처] https://velog.io/@yooha9621/SQLP%EC%8B%A4%EA%B8%B0%ED%92%80%EC%9D%B4-DBCall%EC%B5%9C%EC%86%8C%ED%99%9440%EB%B2%88