09. I/O 효율화 원리

하드웨어적 방법을 통해 I/O의 성능을 높이는 것도 좋지만, 애플리케이션 측면에서 논리적인 I/O의 요청 횟수를 최소화하는 것이 I/O효율화 튜닝의 핵심이다.

  • 애플리케이션 측면에서의 I/O효율화 원리
    • 필요한 최소 블록만 읽도록 쿼리작성한다.
    • 최적의 옵티마이저 팩터를 제공한다
    • 필요하다면, 옵티마이저 힌트를 사용해 최적의 액세스 경로로 유도한다.

필요한 최소 블록만 읽도록 쿼리작성

  • 쿼리 옵티마이저가 나름대로 쿼리를 최적화한다.
  • 하지만 SQL명령을 던지는 사용자 스스로 최소 일량을 요구하는 형태로 논리적 집합을 정의하고, 효율적인 쿼리를 작성하는 것이 무엇보다 중요하다.

SELECT *
FROM (
SELECT ROWNUM NO, 등록일자, 번호, 제목, 회원명, 게시판유형명, 질문유형명, 아이콘, 댓글개수
FROM (
SELECT A.등록일자, A.번호, A.제목, B.회원명, C.게시판유형명, D.질문유형명, FUNC_ICON(D.질문유형코드) 아이콘, (SELECT..) 댓글개수
FROM 게시판 A, 회원 B, 게시판유형 C, 질문유형 D
WHERE A.게시판유형 = :TYPE
AND B.회원번호 = A.작성자번호
AND C.게시판유형 = A.게시판유형
AND D.질문유형 = A.질문유형
ORDER BY A.등록일자 DESC, A.질문유형, A.번호
)
WHERE ROWNUM <= 30
)
WHERE NO BETWEEN 21 AND 30


SELECT /*+ ORDERED USE_NL(B) USE_NL(C) USE_NL(D) */
A.등록일자, A.번호, A.제목, B.회원명, C.게시판유형명, D.질문유형명, FUNC_ICON(D.질문유형코드) 아이콘, (SELECT..) 댓글개수
FROM (
SELECT A.*, ROWNUM NO ROWNUM NO
FROM (
SELECT 등록일자, 번호, 제목, 작성자번호, 게시판유형, 질문유형
FROM 게시판 
WHERE 게시판유형 = :TYPE
AND 작성자번호 IS NOT NULL
AND 게시판유형 IS NOT NULL
AND 질문유형 IS NOT NULL
ORDER BY 등록일자 DESC, 질문유형, 번호
) A
WHERE ROWNUM <= 30
)A 회원 B, 게시판유형 C, 질문유형 D
WHERE A.NO BETWEEN 21 AND 30
AND B.회원번호 = A.작성자번호
AND C.게시판유형 = A.게시판유형
AND D.질문유형 = A.질문유형

  • 최종 결과 집합에 대해서만 함수를 호출하고 스칼라 서브쿼리를 수행하도록 변경
  • 결과집합을 확정 짓고서, 그 이후에 조인

select a . 종목코드
, a . 거래량_전일_거래량, a . 거래대금_전일_거래대금
, a . 상한가 _전일_상한가, a . 하한가_전일_하한가
, b. 거래량 주간 거래량, b . 거래 대금 주간 거 래대금
, c . 거래량 전월 총거래량, c . 거 래대금 전월 총거 래대금
, d . 시가총액 전월말 시가총액
, e . 거래량 연중 최 대 거래량, e. 거래대금 연중 최대거래대금
, e . 상한가 연중 상한가, e. 하한가 연중 하한가
from 
 (select 종목코드,거래량, 거 래대금, 상한가,하한가
    from 일별종목거래
  where 거래일자 = to char(sysdate- 1, ' yyyymrdd ' ) ) a
, (select 종목묘드, sum (거래량)거래량 , sum(거래대금) 거래대금
 from 일별종목거래
 where 거래일자 between to char (sysdate-7, ' yyyymrdd ' )
 and to char(sysdate- 1, ' yyyymrdd' )
 group by 종목코드) b
, (select 종목표드, sum ( 거래량) 거래량, sum ( 거 래대금) 거래대금
  from 일별종목거래
  where 거래일자 like to char (add months (sysdate, -1) , ' yyyynm' ) || '%'
  group by 종목코드) c
, (select 종목코드_상장주식수 * 종가 시가총액
   from 일별종목거래
where 거래일자 = to char (last day (add months(sysdate, - 1) ) , ' yyyymmdd ') ) d
, (select 종목코드,max(거래량) 거래랑, max(거래대금) 거래대금
, max(종가)  상한가, min(종가) 하한가
  from 일별종목거래
  where 거래일자 between to char(add months (sysdate, - 12) , ' yyyymmdd ' )
and to char(sysdate-1, ' yyyymmdd ' )
group by 종목코드) e
where			
and b . 종목코드(+) = a . 종목코드
and c . 종목묘드(+) = a . 종목코드
and d . 종목코드(+) = a . 종목코드
and e . 종목코드( +) = a . 종목묘드

select 종목묘드
, sum (case when 거 래 일자 = to char(sysdate-1, 'yyyymmdd' )
       then 거래량 end) 전일 거래량
, sum (case when 거래일자 = to char(sysdate-1, ' yyyymmdd' )
	then 거래대금 end) 전일 거래대금
, max (case when 거 래 일자 = t o char(sysdate-1, ' yyyymmdd' )
	then 종가 end) 전일 상한가
, min (case when 거래일자 to char(sysdate- 1, ' yyyymmdd' )
	then 종가 end) 전일 하한가
, sum(case when 거래일자 between to char (sysdate-7, ' yyyymmdd ' )
	and to char (sysdate-1, ' Yyyyymmdd ' )
        then 거래량 end) 주간 거래량
, sum(case when 거래일자 between to char (sysdate-7, ' yyyymmdd ' )
     and to char (sysdate-1, ' yyyymmdd' )
     then 거래대금 end) 주간 거래대금
, sum (case when 거래일자 like to char (add months (sysdate, - 1) , ' yyyyrrm ' ) ||'%'
       then 거래량 end) 전월 총거래량
, sum(case when 거래일자 like t o char(add months(sysdate, - 1) , ' yyyyrrm ' )||'%'
      then 거래대금 end) 전월 총거래대금
, sum(case when 거래일자 = to char (last day (add months (sysdate, - 1) ) , ' yyyymmdd' ')
      then 상정주식수 * 종가 end) 전월말 시가총액
, max(거래량) 연중 최대거래량
, max ( 거래대금) 연중 최대거래대금
, max (종가) 연중 상한가
, min(종가) 연중 하한가
from 일별종목거래
where 거래일자 between to char (add months(sysdate, - 12) , 'yyyymmdd' )
and to char (sysdate- 1, ' yyyymmdd ' )
group by 종목코드
having sum(case when 거래일자 = to char(sysdate- 1,  'yyyymmdd' ) then 거래량 end) > 0

  • 테이블 한번만 읽고서도 원하는 결과를 도출할 수 있도록 변경
  • 아우터 조인 부분을 SUM CASE문으로 변경하여 구현

최적의 옵티마이져 팩터 제공

  • 전략적인 인덱스 구성
  • DBMS 제공하는 다양한 기능 활용
  • 옵티마이져 모드 설정

통계정보의 중요성

  • dbms_stats.gather_table_stats
    • cpu속도
    • 평균적인 Single block 읽기 속도
    • 평균적인 Multiblock 읽기 속도
    • 평균적인 Multiblock I/O 속도
  • 옵티마이져 모드를 포함해 적절한 초기화 파라미터를 설정해 주고 적설한 통계정보 수집
  • 전략적인 인덱스 구성이 필수적
  • 기타 다양한 DBMS 기능을 들을 적극 확용해 옵티마이져가 최적의 선택을 할 수 있도록 수단을 제공.
  • 필요하다면 옵티마이져 힌트를 사용해 최적의 액세스 경로로 유도