2010년 2월 2일 화요일
RANDOM
2010년 2월 1일 월요일
Optimizer Parameter
2010년 1월 31일 일요일
CPU 통계정보
--- CPU 통계정보 수집 ---
-- 통계수집 테이블 생성
begin
dbms_stats.create_stat_table(
ownname => USER
, stattab => 'mystats'
, tblspace => 'USERS'
, global_temporary => FALSE
);
end;
/
-- 통계수집 on
begin
dbms_stats.gather_system_stats(
gathering_mode => 'start'
, stattab => 'mystats'
, statid => 'OLTP');
end;
/
-- 통계수집 off
begin
dbms_stats.gather_system_stats(
gathering_mode => 'stop'
, stattab => 'mystats'
, statid => 'OLTP');
end;
/
-- 통계 테이블 export
begin
dbms_stats.export_system_stats('mystats','OLTP',USER);
end;
/
-- 통계 테이블 import
begin
dbms_stats.import_system_stats('mystats','OLTP',USER);
end;
/
또는 ..
execute dbms_stats.gather_system_stats('start');
execute dbms_stats.gather_system_stats('stop');
--- CPU costing 직접 설정 ---
begin
dbms_stats.set_system_stats('CPUSPEED',700);
dbms_stats.set_system_stats('SREADTIM',0.20);
dbms_stats.set_system_stats('MREADTIM',0.40);
dbms_stats.set_system_stats('MBRC',14);
end;
/
alter system flush shared_pool;
-- 실행 --
** SREADTIM 과 MREADTIM 이 1 미만일 경우 ( 0.0x ~ 0.99 )
오라클 옵티마이져는 정확한 통계정보를 수립하지 못하며, NOWORKLOAD 또는 추가적인 계산 방법을 이용하여 Cost 를 계산하는것으로 보인다.
2010년 1월 29일 금요일
DB_FILE_MULTIBLOCK_READ_COUNT(MBRC)
출처 : ( oracleclub.com ) http://wiki.oracleclub.com/display/DBSTUDY/DB_FILE_MULTIBLOCK_READ_COUNT
DB_FILE_MULTIBLOCK_READ_COUNT(MBRC)
- 정의 : Full Table Scan 시에만 영향을 미치는 파라미터.
한번의 I/O 작업으로 읽어들이는 최대 블럭 수. Multi Block I/O 에 관련된 파라미터 - 값 설정하기
- db_block size * db_file_multiblock_read_count <= 오라클의 최대 I/O 크기(64KB)
- default value : O/S에 따라서 다름 (Linux redhat itanium : 16)
일반적으로 db_block_buffers와 Processes에 의해서 결정되며 4~32 정도가 많이 사용됨 - FULL TABLE SCAN과 DB_FILE_MULTIBLOCK_READ_COUNT
FULL TABLE SCAN을 할 때에는 DB_FILE_MULTIBLOCK_READ_COUNT 이 설정된 만큼을 한꺼번에 데이터를 가져옴
ex) DB_FILE_MULTIBLOCK_READ_COUNT=8 이고 db_block_size가 8k라면 8*8=64k 만큼을 한꺼번에 가져옴- extent의 크기가 작을 경우 : multiblock I/O로 데이터를 읽지 않고 single block I/O를 사용해서 읽음 (I/O의 단위 : Block)
- extent안의 블록들이 db_file_multiblock_read_count 보다 작게 되면 db file sequential read(single block I/O시에) 라는 event 발생
- MBRC크기보다 큰 extent는 multiblock I/O로 읽다가 extent가 끝나는 부분에 MBRC크기 보다 작은 block이 남아있을 경우에는 single block I/O로 읽음
- full scan할 때에는 extent의 크기가 MBRC가 설정된 크기보다 작을 경우에는 single block I/O로 읽게 되므로 성능저하가 될 수 있고, MBRC가 설정된 값에 따라서 optimizer가 full scan or index scan 여부 결정
- 단점 : 이 파라미터가 크게 설정되어 있다면 블록을 읽어올 때, 설정된 값만큼 읽어오므로 buffer pool에서 다른 블록들이 flush될 수 있음
- INDEX SCAN과 DB_FILE_MULTIBLOCK_READ_COUNT
- Index scan시에는 db_block_size의 설정이 중요
- B-tree Index 에서 블록 크기가 8KB(db_block_size=8KB) 라면 2KB 인 경우보다 거의 4배 빨리 데이터를 읽음
- Index Block 의 Pctfree가 너무 크고 인덱스의 Entry Size 가 늘어나지 않으며 기존의 인덱스 값에 새로운 레코드가 더 이상 추가되지 않을 경우 : 공간의 낭비가 심하게 되므로 적절한 값으로 조정
- index range scan 을 위해 index full scan 이나, fast full index 을 피하는 방법
- index full scan , FFIS 를 선택한 이유 : index 의 LEAFCNT(leaf block count)전체를 읽는 cost < branch level (BLEVEL) 의 cost, 또는 CLUFAC(clustering factor) 의 cost
- 해결 방법
- index 의 height 를 줄이기 위해 db_block_size를 늘림
- ndex reorganization 수행
- 임시적인 방법 : FFIS 나 full index scan cost 를 높이기 위해 index cost 를 결정하는 파라미터를 조정 (아래 3개의 파라미터 값을 작게 조정)

fast_full_scan_enabled =false
db_file_multiblock_read_count
sort_area_size
- System Statistics와 DB_FILE_MULTIBLOCK_READ_COUNT
- System Statistics가 없는 상황 : db_file_multiblock_read_count, optimizer_index_cost_adj와 같은 파라미터들이 Index Scan과 Table Scan중 어느 것을 선택할지를 결정하는데 큰 역할 함
- System Statistics가 정상적으로 수집된 경우 : DB_FILE_MULTIBLOCK_READ_COUNT 파라미터가 Optimizer의 비용 계산에 고려되지 않음.
- mbrc는 Optimizer에 의해 실행 계획이 생성될 때는 무시되지만 실제 Fetch과정에서 db_file_multiblock_read_count 크기만큼 Multi Block I/O함
- System Statistics가 없는 상황 : db_file_multiblock_read_count, optimizer_index_cost_adj와 같은 파라미터들이 Index Scan과 Table Scan중 어느 것을 선택할지를 결정하는데 큰 역할 함
- 10g R2 MBRC를 대신하는 parameter
- _db_file_optimizer_read_count : System Statistics가 없는 경우에 Optimizer가 비용을 계산하기 위해 사용. System Statistics가 수집된 경우에는 이 값은 무시
- _db_file_exec_read_count : 쿼리를 실행하는 과정에서 Multi Block I/O를 수행할 때 한번에 읽을 블록 수를 결정. System Statistics의 수집 여부와 무관하게 사용
2010년 1월 22일 금요일
Interesting db_file_multiblock_read_count bug
2010년 1월 11일 월요일
linux block trace [blktrace]
block trace 란 리눅스에서 Disk I/O 가 일어날때,
linux 하위 level 에서 어떻게 Block 단위의 I/O 가 일어났는지 알아낼수 있는 Tool
DB 접근에서 주로 DB recovery 나 join 시의 DIsk I/O 패턴을 알아내는데 유용하다.
1. yum install blktrace-1.0.1-3.XX .. 를 인스톨 한다. ( block trace 뜨는 프로그램 )
http://rpm.pbone.net/index.php3/stat/3/srodzaj/1/search/blktrace
2. seekwatcher 다운로드 ( 생성한 block trace 를 image 로 정리해서 보여줌 )
- 미리 설치할 package : http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-0.99.1/matplotlib-0.99.1.2.tar.gz/download
- seekwatcher http://oss.oracle.com/~mason/seekwatcher/seekwatcher-0.12.tar.bz2
3. seekwatcher 압출을 풀면 seekwatcher 란 실행파일이 생성 됨 이 파일을 /usr/bin 에 복사후 사용
1. mkdir /trace
2. blktrace -d /dev/target_device
3. cd /trace 에 device_name.blktrace 파일이 생성 된다.
seekwatcher -t trace파일
/usr/lib/python2.6/site-packages/matplotlib/rcsetup.py:117: UserWarning: rcParams key "numerix" is obsolete and has no effect;
please delete it from your matplotlibrc file
warnings.warn('rcParams key "numerix" is obsolete and has no effect;\n'
rm .matplotlib/
[root@ljh8324-skku /]# blktrace -d /dev/sdb1
Invalid debug path /sys/kernel/debug: 0/Success