DB 관련 튜닝을 공부하다 보면 쿼리 튜닝이 아닌 성능적으로 튜닝이 필요한 경우가 있다.

그럴때 마다 나오는 것이 PCTFREE / PCTUSED 다.


하지만 Block 관련된 core 부분을 대충 공부하고 넘어가면, 나처럼 정리된 것을 다시 한번 읽어 보는 경우가 생긴다.


그래서 정리한 나의 Text 문서들을 한번에 복사해서 정리해 봤다.


Block

- Block 단위로 작업 (Defualt 8K)






- DB_BLOCK_SIZE 파라미터는 Create Database 하면서 지정이 되며, Database를 재생성하기 전까지는 변경이 불가능(Standard block size)


- 혹시라도 DB_BLOCK_SIZE 외의 size로 지정하기 위해서는 Buffer Cache 에도 해당 Block size 만큼 공간을 미리 할당해 두어야 함(아니면 에러가 발생)


  ex) SQL> create tablespace test_4k datafile 'D:\ora_data\orcl\test_4k.dbf' size 5m blocksize 4k;

ERROR at line 1:

ORA-29339: tablespace block size 4096 does not match configured block sizes



SQL> alter system set db_4k_cache_size=10m; -> DB Cache에 미리 공간을 할당


Data block 구조


-- Block 정보에 대한 size 와 type 확인(Default)

select component, type, description, type_size 

from v$type_size

where component in ('KCB', 'KTB');



- Block Header



1. Transaction layer

A. Transaction layer-fixed

 - Block Type

 - 마지막으로 수행된 Block cleanout 시간

 - ITL Entries 정보

 - Free list link 정보

 - Free space lock 정보


  B. Transaction layer-variable

    - 24byte를 가짐

    - Block 에 있는 Row 를 변경하기를 원하는 실제 ITL 관련 정보 저장

      - ITL (Interested Transaction) 특정 Block 에 데이터를 변경해야 할 경우 해당 Block에 사용자 명단에 자신의 정보(TxID)를 적고 변경

        (사용하는 대기자 명단)

      - 가변성 으로써 기본으로 Table에 대한 1개 / Index에 대한 2개의 ITL 정보

      - 테이블이나 인덱스를 생성할 때 INITRANS 파라미터의 값을 변경하면 그 기본값을 변경할 수 있음

      

2. Cache layer

  - Data Block Address(DBA)

  - Block Type (ex- Table, Index, Undo..)

  - Block Format(v6, v7, v8...)

  - System Change Number(SCN: 복구 작업 등에 사용됨)


PCTFREE 와 PCTUSED


PCTFREE (Block의 Defualt 10%)

  - Block에 입력되어 있는 데이터들이 Update될 경우를 대비해 예약을 해 두는 공간(오직 Update)

  - update 했을 때 행의 크기 증가에 대비해 여유 공간을 만듦


PCTUSED (Block의 Defualt 40%)

- Block에서 row가 삭제되는 경우 Dirty List에 등록된(Free Block 에서 Dirty Block이 된) Block이, 

 Free Block 되는 상태까지 남은 용량이 얼마나 되는 지 결정하는 값

- Dirty Block이(block 들이 모여서) Free Block 의 상태까지 될 수 있는 값

  - PCTUSED 에 설정된 퍼센트 값만큼 남아서 Free space가 확보 되면 이 Block을 Free Block 으로 설정되어 Insert가 가능


※ PCTREE를 많이 주면 Update 가 많이 발생할 경우 좋지만 update가 자주 발생 안되면 비효율적인 공간이 됨


-----------------------------------------------------------------------------------------------

기본 pctfree 10 -> 5로 변경 (update 문이 적을 경우 괜찮을 듯..)


--기존 Table들에 대한 정보

select

   table_name, owner, pct_free, pct_used, num_rows

from

   dba_tables

where 

avg_row_len > 1

and 

avg_row_len < .5*&blksz

and

table_name not in

 (select table_name from dba_tab_columns b

   where

 data_type in ('RAW','LONG RAW','BLOB','CLOB','NCLOB')

 )

and owner not like '%SYS%'

order by 

   owner, 

   table_name

;


rem pctused.sql

set heading off;

set pages 9999;

set feedback off;


--보통 8k 기본(8192)

column db_block_size new_value blksz noprint

select value db_block_size from v$parameter where name='db_block_size';


define spare_rows = 2;


select

   ' alter table '||owner||'.'||table_name||

   ' pctused '||least(round(100-((&spare_rows*avg_row_len)/(&blksz/10))),95)||

   ' '||

   ' pctfree '||greatest(round((&spare_rows*avg_row_len)/(&blksz/10)),5)||

   ';'

from

   dba_tables

where 

avg_row_len > 1

and 

avg_row_len < .5*&blksz

and

table_name not in

 (select table_name from dba_tab_columns b

   where

 data_type in ('RAW','LONG RAW','BLOB','CLOB','NCLOB')

 )

and owner not like '%SYS%'  --SYS 관련 계정 제외

order by 

   owner, 

   table_name

;


Row

  1. Row Header(Overhead)

    - Row에 동시에 Transaction 을 일으키는 것을 막기 위한 Lock 정보 기록

    - Row piece에 들어있는 Column Data의 개수 기록

  2. Column Data

    - 실제로  Data가 저장되는 곳


Row Chaining

  - Block의 Column Data 부분에 모두 기록할 수 없을 경우, Row를 다른 Block 에 연결해서 저장

  - Row chaining 이 많이 일어나는 경우 Block 의 크기를 크게 해 주면 되지만 wait 현상이 많이 발생(Write complete waits, Buffer Busy Waits 등) 성능 저하 가능성

Row migration

  - 특정 Block에 위치하던 Row 가 update 등의 이유로 해당 Block 의 공간이 부족해서 다른 공간으로 이사를 가는 것을 의미

  - 해당 Block 에 빈 공간이 부족해서 일어나는 현상이므로 PCTFREE 값을 많이 주거나 테이블 재생성(Reorg) 작업을 통해 줄일 수 있음 

  - pctfree 가 큰 경우 update 가 많치 않을 경우 공간 비효율성 발생

※ I/O가 더 많이 일어나는 장점



참고 문서

 - "오라클 관리 실무" 책을 공부하면서 정리한 내용


사진 출처

http://hayleyfish.tistory.com/74

반응형

오전에 OS 담당자로부터 dump 관련하여 문제가 있어 보인다고..(단순히 이렇게 던짐...ㅎㄷㄷ)

하여 해당 DB dump 쪽을 모두 확인해 보았다.


당연히!!!alert log에는 어떠한 오류도 없었다!!!

(이럴 때는 자부심이..!!!!ORA- 떨어져 있으면 -_-!!!!!ㅎㅎ)


각설하고, 혹여나 udump 쪽을 확인했다. 예전에 누군가가 trace를 걸어놔서 그거 잡느라 고생했기에...

파일들이 엄청 많아서 확인했더니, 아래와 같은 것들이 있었다.




예전에도 bug로써 패치를 진행하면 해결이 된다고 찾아 봤기에 한번 더 확인해 보았다.


Bug 9772888 - Needless "WARNING:Could not lower the asynch I/O limit to .. for SQL direct I/O It is set to -1" messages (문서 ID 9772888.8)


역시나, 즐겨찾기가 되어 있어서 한눈에 찾아 볼 수 있었다.


일단 내용을 찾아보면 아래와 같다

Description


Trace files may be seen with warning of the form:

 WARNING:Could not lower the asynch I/O limit to 160 for SQL direct I/O. 

 It is set to -1 

 

This bug is specifically for the case of messages showing "It is set

to -1" in the message.

 

Workaround

Ignore the message - it is spurious and of no value.

The fix only hides the message so that it does not produce "noise"


ASYNCH I/O를 더 낮출 수 없다는 메시지인데, Asynch I/O는 아래와 같다.(발췌)

 Asynchronous I/O는 processes들이 write를 한 후에 기다리지 않고 바로 다음 작업을 수행할 수 있도록 해주는    Input/Output mechanism입니다.

   Asynchronous I/O는 불필요하게 낭비되는 idle time을 최소화해서 system 성능을 향상시켜 줍니다.

   DBWR는 각각의 I/O에 방해받지 않습니다.

[출처] http://shadou.tistory.com/entry/ASYNCIO%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%A7%88%EB%AC%B8%EB%93%A4


patch는 10.2.0.5.2 에서 되니 그 상위 버전으로 패치하면 될 듯 싶다.

현재는 psu가 전혀 안되어 있다.



이번 주 일요일에 작업 완료 후 다시 확인해서 리플로 결과를 공유 하겠습니다.


아래는 HP-UX 관련한 문서 번호이다. 필요 시 찾아보면 좋을 듯 싶다.

HP-UX: Asynchronous i/o (Doc ID 139272.1)


반응형

새해 인사는 그래도 해야겠죠!!!


참고로 저는 천주교 신자라 성탄 인사도 해야됬지만...

연말은 정신없기도 하고, 마음이 붕~~~~떠있는 시간들이라


마음을 가다듬고 새해 인사 드리려 합니다.


새해에는 가정의 평화와 행복이 함께 하시고, 항상 건강하시고, 하시고자 하는 일이 모두

잘 되시기를 바랍니다.


새해 복 많이 받으세요.


저희집에 새 식구 축복이도 건강하고 정신적으로도 온전한 상태로 저희 곁에 왔으면 합니다.

개인 적으로도 이리저리 좋은 일이 가득했으면 하네요 :)




반응형

'Life' 카테고리의 다른 글

누군가에게 제안하기 전에..  (0) 2016.07.01
블로그의 의미  (0) 2016.03.14
[16.01.12] 뭐가 더 옳은 걸까..  (0) 2016.01.12
즐거운 여름휴가 (1)  (0) 2015.08.05
처음은 아니지만 블로그의 시작  (1) 2015.07.31

+ Recent posts