Contents

I/O 효율화의 원리

  • 애플리케이션 측면에서 논리적인 I/O의 요청 횟수를 최소화하는 것이 I/O효율화 튜닝의 핵심
  • 하드웨어적인 방법을 통해 I/O 성능을 향상시킬수 있다. (비효율의 근본적인 해결책이 아님)
    RAW Device, 비동기 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
  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

최적의 옵티마이징 펙터 제공

  • I/O의 효율화를 위해서는 논리적인 집합 재구성을 통해 읽어야 할 데이터 양을 최소화 할수 있어야 한다.
    사용자의 의도대로 블록 엑세스를 최소화하면서 효율적인 쿼리 프로세싱을 할 수 있도록 하려면 최적의 옵티마이징 펙터를 제공해 주어야 한다.

전략적인 인덱스 구성

  • 전략적인 인덱스 구성은 옵티마이저를 돕는 가장 기본적인 옵티마이징 펙터이다.

DBMS가 제공하는 다양한 기능 활용

  • 인덱스 외에 DBMS 가 제공하는 파티션, 클러슽터, IOT(INDEX ORGANIZED TABLE), MV(Materialized View), FBI(Function Based Index) , 분석 함수 등 DBMS 가 제공하는 기능들을 활용한다.

옵티마이저 모드 설정

  • 옵티마이저에게 작전 명령을 내릴 때도 전체 레코드를 다 읽을 생각인지, 아니면 10 건만 읽고 멈출지 목적을 분명히 밝혀야 한다.

통계정보의 중요성

  • dbms_stats.hather_table_stats 프로시져를 이용한 테이블 통계정보 수집
    CPU 속도
    평균적인 Single block 읽기 속도
    평균적인 Multiblock 읽기 속도
    평균적인 Multiblock I/O 속도