더북(TheBook)

프로그램의 총 수행 시간을 출력하는 방법은 16장에서 잠깐 소개한 적이 있는데 복습하는 차원에서 다시 CH17_SRC_TEST_PKG 패키지의 SALES_DETAIL_PRC에 적용해 보자.

입력

    CREATE OR REPLACE PACKAGE BODY ch17_src_test_pkg IS

      PROCEDURE sales_detail_prc ( ps_month IN VARCHAR2,
                                   pn_amt   IN NUMBER,
                                   pn_rate  IN NUMBER   )
    IS
      vd_sysdate     DATE;        -- 현재일자
      vn_total_time NUMBER := 0;  -- 소요시간 계산용 변수

    BEGIN
      DBMS_OUTPUT.PUT_LINE('--------------<변수값 출력>---------------------');
      DBMS_OUTPUT.PUT_LINE('ps_month : ' || ps_month);
      DBMS_OUTPUT.PUT_LINE('pn_amt   : ' || pn_amt);
      DBMS_OUTPUT.PUT_LINE('pn_rate  : ' || pn_rate);
      DBMS_OUTPUT.PUT_LINE('------------------------------------------------');

      --1. p_month에 해당하는 월의 CH17_SALES_DETAIL 데이터 삭제

      -- delete 전 vd_sysdate에 현재시간 설정
      vd_sysdate := SYSDATE;

      DELETE ch17_SALES_DETAIL
       WHERE sales_month = ps_month;

      -- DELETE 소요 시간 계산(초로 계산하기 위해 60 * 60 * 24을 곱함)
        vn_total_time := (SYSDATE - vd_sysdate) * 60 * 60 * 24;
      DBMS_OUTPUT.PUT_LINE('DELETE 건수 : ' || SQL%ROWCOUNT || ' , 소요시간: ' || vn_total_time );

      --2. p_month에 해당하는 월의 CH17_SALES_DETAIL 데이터 생성
      vd_sysdate := SYSDATE;

      INSERT INTO ch17_SALES_DETAIL
      SELECT b.prod_name,
             d.channel_desc,
             c.cust_name,
             e.emp_name,
             a.sales_date,
             a.sales_month,
             sum(a.quantity_sold),
             sum(a.amount_sold)
        FROM sales a,
             products b,
             customers c,
             channels d,
             employees e
       WHERE a.sales_month = ps_month
         AND a.prod_id     = b.prod_id
         AND a.cust_id     = c.cust_id
         AND a.channel_id  = d.channel_id
         AND a.employee_id = e.employee_id
      GROUP BY b.prod_name,
               d.channel_desc,
               c.cust_name,
               e.emp_name,
               a.sales_date,
               a.sales_month;

      -- INSERT 소요 시간 계산(초로 계산하기 위해 60 * 60 * 24을 곱함)
      vn_total_time := (SYSDATE - vd_sysdate) * 60 * 60 * 24;
      DBMS_OUTPUT.PUT_LINE('INSERT 건수 : ' || SQL%ROWCOUNT || ' , 소요시간: ' || vn_total_time );

      -- 3. 판매금액(sales_amt)이 pn_amt보다 큰 건은 pn_rate 비율만큼 할인
      vd_sysdate := SYSDATE;

      UPDATE ch17_SALES_DETAIL
         SET sales_amt = sales_amt - ( sales_amt * pn_rate * 0.01)
       WHERE sales_month = ps_month
         AND sales_amt   > pn_amt;

      -- UPDATE 소요 시간 계산(초로 계산하기 위해 60 * 60 * 24을 곱함)
      vn_total_time := (SYSDATE - vd_sysdate) * 60 * 60 * 24;
      DBMS_OUTPUT.PUT_LINE('UPDATE 건수 : ' || SQL%ROWCOUNT || ' , 소요시간: ' || vn_total_time );

      COMMIT;
      EXCEPTION WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
        ROLLBACK;

      END sales_detail_prc;
    END ch17_src_test_pkg;

결과

    PACKAGE BODY CH17_SRC_TEST_PKG이(가) 컴파일되었습니다.

굵게 표시된 부분이 소요 시간을 계산해 출력하는 부분이다. 각 DML문장 실행 전에 vd_sysdate 변수에 현재일자를 할당한 후 문장 수행이 끝나면 현재일자(SYSDATE)에서 vd_sysdate 변수를 빼서 소요 시간을 구하고 있다. “DATE 타입_DATE 타입”의 연산 결과 단위는 숫자로 일(日)을 나타낸다. 따라서 일(日)을 초로 환산하기 위해 (24 * 60 * 60)을 곱한 것이다. 그럼 프로시저를 실행해 보자.

입력

    BEGIN
      ch17_src_test_pkg.sales_detail_prc ( ps_month => '200112',
                                           pn_amt   => 50,
                                           pn_rate  => 32.5 );
    END;

결과

    --------------<변수값 출력>---------------------
    ps_month : 200112
    pn_amt : 50
    pn_rate : 32.5
    ------------------------------------------------
    DELETE 건수 : 22698 , 소요 시간: 2
    INSERT 건수 : 22698 , 소요 시간: .9999999999999999999999999999999999999984
    UPDATE 건수 : 7643 , 소요 시간: 0

앞의 결과를 보면 DELETE, INSERT, UPDATE가 각각 2, 0.9, 0초 정도 소요된 것을(소요 시간은 실행할 때마다 달라질 수 있다) 알 수 있다. 이런 식으로 DML 문장이 수행된 소요 시간은 해당 문장의 실행 전, 후의 시간 차이를 계산함으로써 구할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.