2025년 3월 25일 화요일

SQLP #6 - 일반


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



MSSQL - Cursor vs Temp Table

#테이블 변수사용의 예 use pubs go declare @tmptable table (     nid int identity(1,1) not null,     title varchar (80) not null ) -- 테이블 변수 선언 inse...