2014년 7월 30일 수요일

[SGA튜닝]DataBase Buffer Cache의 튜닝[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

DataBase Buffer Cache의 튜닝 

 데이터베이스 버퍼 캐시는 데이터 처리를 위해 사용되는 부분이며 가장 최근에 사용 되어진 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  / 




평일주간[100%환급과정]
(8/04)C#4.0,WinForm,ADO.NET
(8/04)자바기초JDBC,Servlet/JSP까지
(8/04)Spring,MyBatis,Hibernate실무과정
(8/11)PL/SQL,ORACLE HINT,TUNING
(8/11)SQL기초에서 Schema Object까지
(8/11)안드로이드개발자과정
(8/11)채용예정교육
평일야간[개인80%환급]
(8/04)웹퍼블리싱 마스터
(8/05)JSP,jQUERY,Spring,MyBatis
(8/06)Spring3.X, MyBatis, Hibernate
(8/08)C#,Network,ADO.NET,ASP.NET
(8/11)SQL기초에서실무까지
(8/11)안드로이드개발자과정
(8/28)자바JSP,jQuery,Spring,MyBatis
주말주간[개인80%환급]
(8/02)Spring3.X, MyBatis, Hibernate
(8/02)C#,ASP.NET마스터
(8/02)웹퍼블리싱 마스터
(8/02)SQL초보에서 Schema Object까지
(8/09)SQL기초에서실무까지
(8/09)안드로이드개발자과정
(8/09)자바JSP,Ajax,jQuery,Spring,MyBatis
(8/23)JAVA,Network&WEB&Framework
주말야간[개인80%환급](18:30~22:20)
(8/02)JAVA,Network&WEB&Framework
(8/09)SQL기초에서실무까지

댓글 없음:

댓글 쓰기