레이블이 SLQ튜징인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SLQ튜징인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 3일 목요일

오라클 논리적 저장 공간, 오라클의 논리적 구성, 데이터베이스 구성,테이블,테이블스페이스,블로그 익스텐트

오라클 논리적 저장 공간, 오라클의 논리적 구성, 데이터베이스 구성,테이블,테이블스페이스,블로그 익스텐트


논리적 저장영역
1. Data Block
- Oracle에서 Data를 저장하는 가장 작은 단위, 블록단위로 DataBase의 DataFile에 있는 저장영역
을 관리한다.
- Data Block의 크기는 최대한계내에는 운영체제 블록크기의 배수여야 한다.
- 구성
  Head : 블록주소와 Segment유형(Data,Index,RollBack…)등의 일반적인 블록정보를 포함
Table Directory : 해당블록에 행을 가지는 Table에대한 정보를 가진다.
Row Directory : 블록내의 실제 행에 대한 정보를 가진다.
Row Data : Table Data Or Index Data를 포함한다.
빈영역
  트랜잭션 입력항목에 사용되는 영역 :  블록내의 하나이상의 행을 Access하는
                                      Insert/Update/Delete/Select등의 명령문은
                                      블록에 하나의 트랜잭션 입력항목을 필요로 한다.
                                      대부분의 운영체제에서는 약23 Byte정도를 필
                                      요로함


2. Extents
- 저장영역할당을 위한 논리적인 단위로 연속적인 몇 개의 Data Block으로 구성된다.
- 각 Segment는 적어도 하나이상의 Extents(RollBack Segment는 2개이상)를 자지고 생성됩니다.
이러한 확장을 initial extents라고 한다.
- 일반적으로 한 Segment의 확장영역은 drop table또는 drop cluster명령으로 개체를 삭제하여
TableSpace에 반환한다.
(예외)truncate … drop storage를 이용하여 Table이나 Cluster를 Truncate시킬수 있슴
    Oracle은 주기적으로 RollBack Segment에 있는 하나이상의 Extents를 해제할수
    있다.
    DBA는 alter table table_name deallocate unused명령을 이용하여 확장영역을 해제할
    수 있다.


3. Segment
- Extents(확장영역)의 집합
A. Data Segment
- DataBase의 SnapShot과SnapShot Log를 포함한 모든 Cluster화 되지 않은 Table은 자신의
Data를 저장하기위해 단일데이터세그먼트(Single Data Segment)를 가진다. Create
Table/SnapShot/SnapShot Log명령을 사용하여 Object를 생성할때 Data Segment를
생성하며 Create Cluster명령이 실행될때 Cluster 에 대한 Data Segment를 생성한다.

B. Index Segment
- Index생성시 Segment할당된다.(Create Index…)

C. RollBack Segment
- Transaction이 RollBack되어야할 경우 트랜잭션 작동을 기록
- 각 DataBase에는 하나이상의 RollBack Segment가 있슴
- Transaction별로 변경되기전의  Data를 기록
- Transaction을 Commit할때 RollBack Segment의 정보를 해체하지만 바로 없애지는 않는다.
Transaction을 Commit 하기전에 시작된 Query에 관련된 Data의 read-consistent  view(읽기
일관성 뷰)를 생성하지위해 data가 RollBack Segment에 남아 있다.
그러한 View를 생성할 가능성이 있는한 RollBack Data를 사용할 수 있도록 Oracle은
RollBack Segment의 확장영역을 순차적으로 사용한다.
RollBack Segment의 마지막 영역이 꽉차면 첫번째 Extents로 돌아가서 RollBack Data를 기록함.
또한 장기적으로 실행되는 Transaction은 RollBack Segment에 새로운 Extents(확장영역)를
요구할수도 있슴.

D. Temp Segment
- Create Index, Select Order By, Select Distinct, Select Group By, Select Union,
Select,Minus,Select ,Intersect등의 명령은 Temp Sefment를 필요로 한다.
예를들어 Query에 Distint,Group By,Order by등이 있으면 Oralce은 두개의 Temp
Segment를 요구할수도 있다. 명령이 완료되면 Oracle은 Temp Segment를 삭제한다.

- Oracle은 사용자 Session기간 동안 필요한만큼의 Temp Segment를 생성한다.
Create User나 Alter User등의 명령에 Temporary TableSpace다음의 TableSpace에 Temp
Segment를 생성한다. 사용자가 Temp Segment를 생성하지 않으면 Default System TableSpace임

예)create user scott identified by tiger default tablespace users temporary
tablespace temp;

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터
(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  




2013년 9월 9일 월요일

자바FTP,자바교육,자바강좌,오엔제이프로그래밍,자바로 만든 FTP 클라이언트(파일업로드예)

자바FTP,자바교육,자바강좌,오엔제이프로그래밍,자바로 만든 FTP 클라이언트(파일업로드예)


FTP를 위한 컴포넌트는 http://www.savarese.org/downloads/NetComponents/ 에서 다운 받으시구요...

/**------------------------------------------------------------------------------------
  * 시스템명 : FTP Client
  * 작 성 자 :
  * 수 정 자 : 이종철(오엔제이프로그래밍실무교육센터,오라클자바커뮤니티)
  * 파 일 명 : OracleJavaFtpClient.java
  * 버    전 : 1.3
  * 개    요 :파일을 FTP서버의 Log 폴더에 저장한다.
   *-----------------------------------------------------------------------------------*/


package new_OracleJava.util;

import java.io.*;
import new_OracleJava.engine.OracleJavaConfig;
import com.oroinc.net.ftp.*;


public class OracleJavaFtpClient{
    static String server = "xxx.xxx.xxx.xxx";
    static int port = 21;
    public static String id = "id"
    public static String password = "pwd"
   
    FTPClient ftpClient = null;

    public OracleJavaFtpClient() {     
            ftpClient = new FTPClient();
    }

    public void sendFile() {
           
            try {                                                 
                    boolean res = false;
            String MyFile = "/use/local/logs/a.log";         
               
            File f = new File(MyFile);

            BufferedInputStream bi = new BufferedInputStream(new FileInputStream(f.getPath()));
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
           
            //FTP 서버의 폴더...
            ftpClient.changeWorkingDirectory("/ftpserver/usr/local");
           
            if (bi != null) {
              res = ftpClient.storeFile(OracleJavaConfig.libSystemChkFileName, bi);
            }         
            else {
                    System.out.println("FileStrema 생성 오류!!!");
            }
           
            bi.close();
                       
            //ftpClient.storeFile(OracleJavaConfig.libWAS2FTPPath, new FileInputStream(new File(MyFile)));
            if (res) {
                    Log.println("OracleJavaSystemChkThread", "FTP 전송 OK~~~");
                    System.out.println("FTP 전송 OK~~~");
            }
            else {
                    Log.println("OracleJavaSystemChkThread", "FTP 전송 실패~~~");
                    System.out.println("FTP 전송 실패~~~");
            }
                //ftp.logout();
                //ftp.disconnect(); 
                //ftp = null;
            }
            catch(Exception e) {
                Log.println("OracleJavaSystemChkThread", "*******************************************************************************");
          Log.println("OracleJavaSystemChkThread", "******************************** Exception FTP Send****************************");
          Log.println("OracleJavaSystemChkThread", "*******************************************************************************");
          Log.println("OracleJavaSystemChkThread", e.toString() + "\n");
            }
    }

    // 계정과 패스워드로 로그인
    public boolean login(String user, String password) {
        try {
            //this.connect();
            return ftpClient.login(user, password);
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로부터 로그아웃
    public boolean logout() {
        try {
            return ftpClient.logout();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로 연결
    public void connect() {
        try {
           
            ftpClient.connect(server, port);           
            int reply;
            // 연결 시도후, 성공했는지 응답 코드 확인
            reply = ftpClient.getReplyCode();
       
            if(!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();               
                Log.println("OracleJavaSystemChkThread", "*************************************************");
                Log.println("OracleJavaSystemChkThread", "서버로부터 연결을 거부당했습니다\n");
                Log.println("OracleJavaSystemChkThread", "************************************************");
                System.exit(1);
            }
        }
        catch (IOException ioe) {
            if(ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch(IOException f) {
                    //
                }
            }
            Log.println("OracleJavaSystemChkThread", "*************************************************");
            Log.println("OracleJavaSystemChkThread", "서버 연결 불가!!\n");
            Log.println("OracleJavaSystemChkThread", "************************************************");           
        }

// FTP의 ls 명령, 모든 파일 리스트를 가져온다
    public FTPFile[] list() {
        FTPFile[] files = null;
        try {
            files = this.ftpClient.listFiles();
            return files;
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }

    // 파일을 전송 받는다
    public File get(String source, String target) {
        OutputStream output = null;
        try {
            File local = new File(source);
            output = new FileOutputStream(local);
        }
        catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        }
        File file = new File(source);
        try {
            if (ftpClient.retrieveFile(source, output)) {
                return file;
            }
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }


    }

    // 서버로부터 연결을 닫는다
    public void disconnect() {
        try {
            ftpClient.disconnect();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

}




=======================================================
=======================================================

다른 자바 프로그램에서... 다음과 같이 호출하여 이용했습니다.

                OracleJavaFtpClient ftpClient = new OracleJavaFtpClient();               
                ftpClient.connect();
                ftpClient.login(OracleJavaFtpClient.id, OracleJavaFtpClient.password);
                ftpClient.sendFile();
                ftpClient.logout();
                ftpClient.disconnect();



오라클자바커뮤니티 실전 개발 교육 - 개인80% 환급

Spring3.X, MyBatis, Hibernate실무과정

강좌명 Spring3.X, MyBatis, Hibernate실무과정(평일야간)
오라클자바커뮤니티(www.oraclejavanew.kr) 추천 실전강좌
교재 자체교재 or PDF 파일 제공
강좌 일정 09월12일(목) ~ 10월04일(금)((평일야간) 19:00~22:00, 12일) 총 36시간
강의 장소 [C강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 590,000원
[고용주환급]대기업:14만원 전후, 중소기업:187,047 원환급

[개인수강지원(개인환급)]정규직 472,000 ,비정규직:전액환급
대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원)


* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본과정은 자바 웹개발에서 가장 많이 사용되고 있는 자바기반 프레임워크인 Spring3.2를 학습하는데 스프링이 왜 도입되어야 하는지부터, 기본모듈구성, 아키텍처 DI, DL, IoC, 최근 개발모델의 핵심인 Spring AOP, AspectJ Annotation, 표현언어인 SpEL, Spring MVC, Spring MVC TEST Framework, Spring WebFlow, Spring JDBC, Spring Transaction등 개발에 필요한 부분을 체계적으로 실습을 통해 학습하며 SQLMapper인 MyBatis, Hibernate 까지 학습하는 Spring 최고의 교육 입니다.

[특징]
- 실무/실습에 근거한 이론 취득
- 단기간에 스프링 개발자로 양성
- 문답씩 수업으로 수강 효과 극대화
- 이론/실습 과제로 인한 개발력 UP
교육목표 - Spring의 도입배경 및 아키텍처에 대해 이해한다.
(자바빈의 태동부터 EJB, 그리고 현재까지)
- Eclipse, Maven, STS 플러그인에 대한 이해
(개발환경 설정의 이해)
- Spring IoC(DI, DL)의 이해
(실습을 통한 setter,getter,constructor injection의 이해)
- Spring AOP의 이해
(실습을 통한 Spring AOP의 이해, AOP어렵지 않습니다)
- AspectJ Annotation에 대한 이해
(Spring의 AspectJ 지원 및 Annotation 대한 이해 by 실습)
- Spring Web MVC, JDBC의 이해
(실습을 통한 Spring MVC, JDBC의 이해)
- Spring Controller에 대한 이해
(간단한 Controller의 구현을 통한 MVC Font Contrller의 이해)
- Spring Web Flow에 대한 이해
(실습을 통한 Spring Web Flow 및 JSF에 대한 이해)
- SpEL에 대한 이해
(실습을 통한 Spring SpEL의 이해)
- Servlet3 비동기 요청에 대해 이해한다.
(실습을 통한 비동기 서블릿에 대한 이해)
- MyBatis Mapper에 대해 이해한다.
(실습을 통한 MyBatis 구성, 작동원리 이해)
- Hibernate Mapper에 대해 이해한다.
(실습을 통한 Hibernate 구성, 작동원리 이해)
- 실무 개발 환경에 적응력 UP
(Spring, MyBATIS 기반 게시판 작성)
교육대상 - JAVA, JSP 개발자
- 자바개발은 오래 했지만 프레임워크에 대해 자신이 없는 개발자
- 단기간에 스프링을 박살 내고 싶은 개발자.
(스프링 혼자 공부하기는 어렵습니다!!)
선수학습 - JAVA, JSP
 

Spring3.2 J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.3 KEPLER, Tomcat7, Spring3.2 다운로드 및 설치)
Maven, STS 플러그인 설치
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Mathod Injection
Spring 설정
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
기타 Spring의 선언적 AOP 선언
Spring JDBC
Spring MVC
Spring Controller
Spring Webflow, JSF
Spring 표현언어 SpEL
Servlet3 비동기 요청처리
Spring3.2 Transaction 관리
Spring MVC TEST Framework
MyBatis/hibernate [MyBatis]
개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
고급 쿼리 사용방법의 이해와 실습
Spring MyBatis 응용예제 작성

[Hibernate]
Hibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성

2013년 8월 8일 목요일

[오라클자바커뮤니티]Struts Validator 프레임워크 소개

Struts Validator 프레임워크 소개 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


스트럿츠의 Validator 프레임워크는 특별한 검증 로직을 개발자가 프로그래밍 하지 않고 애플리케이션의 Validation Rule을 이용하여 설정 할 수 있게 해 줍니다.(사용자가 필수입력 항목에 값을 넣었는지, 값이 지정된 범위에 맞게 되어 있는지, 이메일 주소 형식이 올바른지, 우편번호 형식이 맞는지…)  마치 닷넷 프레임워크의 Validation Control과 같은 기능을 수행 합니다.  (값을 꼭 넣으세요, 나이는 0 ~99 사이 입니다, 전화번호 형식이 잘못 되었군요, E-Mail 주소 형식이 잘못 되었군요와 같은 오류를 출력 할 수 있겠죠^^)

ActionForm에서 개개 프로퍼티에 대해 분리된 검증 로직을 구현하기 위해서는 에러 발견시 수동으로 ActionErrors를 만들고 ActionErros 컬렉션에 추가하는 별도의 작업을 개발자가 해 주어야 합니다.

이러한 방식의 문제점은 애플리케이션 전체에 걸쳐 많은 검증 로직을 포함하는 각각의 ActionForm 내부에 코딩을 해야 한다는 것 입니다. 값이 꼭 입력되어야 하는 “필수입력” 이라는 것만 생각 해 보아도 이것을 개개 프로퍼티(속성) 마다 , 그리고 모든 ActionForm에 대해 기술 한다는 것은 상당한 낭비라고 생각합니다. 물론 이러한 형태는 유지 보수도 어렵게 하는 단점도 있습니다.

Validator Framework는 현재 Jakarta Comons 프로젝트의 한 부분으로 스트럿츠 메인 배포판에 포함되어 있습니다. 물론 Commons 다운로드 페이지에서도 다운 받을 수 있습니다.
(http://jakarta.apache.org/commons)

Validator Framework에는 고유한 기능들을 위한 몇 개의 패키지가 필요한데 그 중 Jakarta ORO 패지지가 가장 중요 합니다. 정규 표현식, 치환, 텍스트 분리 등의 기능을 포함하고 있습니다. 스트럿츠에서 필요로 하는 패키지는 스트럿츠의 배포판에 포함되어 있는데 commons-validator.jar와 commons-oro.jar 파일을 /WEB-INF/lib 폴더에 추가 해야 합니다. 

Validator 프레임워크는 프로그래밍이 아닌 선언을 통해 사용자의 입력 값을 검증 하는 것으로 이것은 결국 소스 외부의 어떤 검증 규칙이 있다는 것을 의미 합니다. 즉 validation-rule.xml과 validation.xml 이라는 두 개의 설정 파일을 필요로 합니다.

---------------------------------
Validator Framework에 관해
---------------------------------

- 일종의 프레임웍 컴포넌트 입니다.
- XML 파일을 통해 설정 하며, 이 파일을 통해 폼의 필드에 대한 Validation 조건을 기술 합니다.
- 날짜나 정수형과 같은 기본 데이터 타입을 위한 Validator가 제공 됩니다.
- 우편번호나 전화번호 같은 패턴 기반 검증도 가능 합니다.
- 멀티 페이지와 지역화된 검증이 지원 됩니다.
- 리소스의 최적 사용 :: JavaScript 검증 기능을 제공 하거나 서버 측의 검증을 보장 가능
- 유지보수를 한곳에서 :: 클라이언트와 서버측 검증 모두를 동일한 Configuration으로부터 생성 가능
- 확장성 :: 사용자 정의 검증은 정규 표현식이나 자바 코드를 통해 가능
- 스트럿츠와의 통합 :: 기본적으로 검증은 스트럿츠의 메시지 번들을 공유
 

--------------------------------------
Validator를 구성하는 Component
--------------------------------------

- Validator
       
기본적인 공통의 타입을 다루며 required mask, minLength, maxLength, range, native types, date, email, credit card등을 포함 합니다.

- Resource Bundle
       
        지역화된 메시지와 라벨을 제공

- XML Configuration (File)

        검증 룰에 대한 정의
       
- JSP Tag

        주어진 폼 이름과 액션 경로를 통한 JavaScript 검증을 발생 시킵니다.       

- ValidatorForm
       
자동적으로 폼빈 이름에 기반한 프로퍼티들을 검증 합니다.
(실행 시점에 ActionMapping 파라미터를 통해 validate() 메소드로 보내어진)

- ValidatorActionForm

        자동적으로 액션 경로에 기반한 프로퍼티들을 검증 합니다.
(실행 시점에 ActionMapping 파라미터를 통해 validate() 메소드로 보내어진)

2013년 8월 5일 월요일

ORACLE DataBase Buffer Cache Tuning

DataBase Buffer Cache의 튜닝


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 
 www.onjprogramming.co.kr 


 데이터베이스 버퍼 캐시는 데이터 처리를 위해 사용되는 부분이며 가장 최근에 사용 되어진 DB 블록을 저장하고 있는 SGA의 구성 요소 입니다. 말그대로 버퍼 캐시이므로 수향 속도와 밀접한 관계가 있습니다. 최근에 사용되어진 데이터를 메모리에 보관해 추후 질의시 이를 이용하여 디스크에서 직접 데이터를 가지고 오지 않고 메모리에서 읽어 오므로 성능의 향상을 꽤 할 수 있는 겁니다. 이 곳에는 변경되지 않은 데이터 뿐 아니라 변경된 데이터도 가지고 있습니다. 또한 DataBase Buffer Cache는 chain list, dirty list, LRU list로 구성 되어져 있습니다. 오라클의 백그라운드 프로세스인 DBWR는 FREE BUFFER의 확보를 위해 변경된 데이테베이스 블록을 디스크(데이터베이스 파일)에 기록하는 역할을 합니다.

 DataBase Buffer Cache의 BUFFER는 LRU list와 dirty list로 구성되는데 LRU list의 버퍼들은 Free buffer, Pinned Buffer, Dirty Buffe중 하나로 존재하게 됩니다. 처음엔 버퍼가 free 상태인데 사용자가 질의를 해서 디스크에서 테이블의 내용을 읽으면 이 블록들은 LRU에서 가장 최근에 읽은 것이므로  HEADER 부분(MRU, Most recently used)에 위치하게 됩니다. 이 버퍼들이 차츰 다른 테이블의 내용들이 읽혀 짐에 따라 LRU의 tail부분인 LRU(Lease Recent Used)로 이동되게 되는 겁니다. 만약 사용자가 대량의 데이터를 질의하여 버퍼가 필요한데 빈 버퍼가 없다면 제일 사용된 빈도가 작은 블록을 찾기 위해 LRU 알고리즘에 의해 LRU list의 맨 끝인 tail 부분부터 검색하기 시작 합니다.

 LRU list의 작 버퍼에 대해 살펴 보면 Pinned Buffer는 현재 사용자가 사용중이므로 재사용 될 수 없는 상태이며 Free Buffer는 dirty buffer등이 데이터파일(디스크)에 기록되어져서 free로 mark가 되어 사용될 수 있는 상태의 버퍼 입니다. 또는 modify 되지않아 사용가능 한 상태를 나타 냅니다. 그리고 dirty buffer는 사용자가 사용하여 내용이 변경되었지만 아직 디스크에 기록되지 않은 버퍼를 나타냅니다.

LRUW(dirty list)는 서버 프로세스에 의해 모아진 dirty buffer들이 모여 있는 곳 입니다. 이 dirty buffer들은 오라클 프로세스들이 빈 버퍼(free buffer)를 찾기 위해 LRU의 tail 부분부터 찾아 가다가 dirty buffer를 만나면 LRUW(dirty list)에 옮겨 놓게 되는 겁니다. 이 버퍼들은 추후 DBWR에 의해 디스크에 있는 데이터파일에 기록되고 다시 free로 mark 되어 LRU list에 자게 되는 것입니다.

이번에는 버퍼 캐시의 튜닝에 대해 알아 보겠습니다.

 버퍼 캐시에 대한 hit ratio는 논리적인 IO와 물리적인 IO에 대한 비율을 의미하며 DataBase Buffer Cache의 성능을 측정 하기 위한 주요한 척도가 됩니다. DataBase Buffer  Cache의 hit ratio는 V$sysstat에서 DB BLOCK GETS와 CONSISTENT GETS, physical reads 값으로 구해지는데 DB BLOCK GETS와 CONSISTENT GETS는 logical read를 의미하며 메모리상의 버퍼에서 access되는 블록을 뜻합니다. Physical reads는 디스크에서 읽는 것을 나타내며 데이터파일에서 로딩되는 블록의 수를 나타냅니다.

 Hit ratio는 90%이상을 유지하는 것이 좋으며 70% 이하기 되었을 때는 db_block_buffers 또는 유_cache_size를 증가 시키는 것이 바람직 합니다. 과거의 Oracle7,8에서는 아래처럼 hit ratio를 구했습니다.

                            (physical reads)
    Hit ratio = ---------------------------------
                          (consistent reads + db_block_gets)

SQL> conn / as sysdba
연결되었습니다.
SQL> select trunc((1-(phy.value/(curr.value + consis.value))) * 100,5)
  2      from v$sysstat phy, v$sysstat curr, v$sysstat consis
  3      where phy.name = 'physical reads'
  4    and curr.name = 'db block gets'
  5      and consis.name = 'consistent gets'
  6  /

하지만 Oracle 8i, 9i에서는 좀더 정확한 값을 구하기 위해 아래처럼 physical reads direct + physical reads direct(lob)를 포함 합니다.

SQL> set serveroutput on
SQL> declare
  2    physicalreads number;
  3    physicalreadsdirect number;
  4    physicalreadsdirectlob number;
  5    dbblockgets number;
  6    consis number;
  7    hratio number;
  8  begin
  9    select value into physicalreads from v$sysstat where name = 'physical r
ads';
 10    select value into physicalreadsdirect from v$sysstat where name = 'phys
cal reads direct';
 11    select value into physicalreadsdirectlob from v$sysstat where name = 'p
ysical reads direct (lob)';
 12    select value into dbblockgets from v$sysstat where name = 'db block get
';
 13    select value into consis from v$sysstat where name = 'consistent gets';
 14    select 100 * (1- (physicalreads - (physicalreadsdirect + physicalreadsd
rectlob))
 15                      /(dbblockgets + consis - physicalreadsdirect -physical
eadsdirectlob )) into hratio
 16          from dual;
 17          dbms_output.put_line('DB Buffer Cache Hit Ratio : ' || hratio);
 18  end;
 19  /