본문 바로가기
OraclE

Database Tuning(펌) | [펠렉스님]현업에서 DB성능 분석하기

by 타마마임팩트_쫀 2008. 11. 26.

Memory Allocation 중요성

 

momory access disk access 빠르기 때문에, data 가능한 Memory 많이 저장되어 data request memory access 해결될 있도록 한다.

 

Reducing Paging and Swaping

많은 OS real memory 들어갈 없는 상당한 양의 정보를 다른 저장 장소로 옮기는데 이를 Paging or Swaping이라고 한다. 이것은 system performance 저하시킨다.

system 전체 memory 할당할 memory 수용하지 못할 경우로, 이때는 system memory 증가시키든가, 그렇지 않으면 할당할 SGA 줄여야 한다.

 

Tunning System Global Area

SGA 목적은 data fast access 위해 memory 두는 것으로, page swap 되어 속도가 저하되어서는 안된다.  초기 파라미터 setting값으로 PRE_PAGE_SGA YES 해서 instance startup시에 모든 SGA real memory 읽어 수는 있으나, swaping이나 paging 막지는 못한다.

 

 

Tuning the Shared  Pool

 

Shared Pool SGA 부분으로, dictionary cache library cache (shared SQL area) 구성되고, LRU algorithm에의해 관리된다.

·            library cache containing shared SQL and PL/SQL areas

·            data dictionary cache

·            information for sessions connected through shared server processes

 

dictionary cache library cache miss data buffer miss보다 expensive하기 때문에 shared pool 충분한 memory 할당해야 한다.

Tuning the Library Cache

library cache SQL PL/SQL area 포함한다.

Cursors

SQL 문은 Library Cache( CONTEXT AREA, CURSOR) 자신의 영역에서  parse된다.

같은 sql문을 쓰는 user 같은 cursor 공유한다.

·            SQL text case, blank, comment까지 같아야 한다.

·            reference되는 object 같아야 한다.

·            bind variable 같아야 한다.

Library cache에서 parse 공간이 모자랄때에는 'oldest cursor' close하고, space 사용된다. cursor 있는 문장이 다시 요구될때는, 다시 parse한다.

 

Cursor 다음의 정보를 저장한다.

·            parsed statement

·            execution plan

·            A list of referenced objects

Parse

syntax check한다.

statement SQL Area 있는지 , Referenced object 같은지 검색한후 같으면, 기존의

shared sql area 사용하고 , parsed sql문이 없으면 새로운 shrared SQL area 할당한다.

Execute Phase

Parse tree data buffer 적용한다.

Physical reads or logical read/writes 한다.

Fetch

SELECT 문을 위해 data row retrieve한다.

 

The V$LIBRARYCACHE Table

librarycache 다음의 것을 포함한다.

·            'SQL AREA'

·            'TABLE?PROCEDURE'

·            'BODY'

·            'TRIGGER'

 

다음 column execution call에서의 library cache miss 나타낸다.

PINS       library cache안의 item 실행된 횟수

RELOADS                execution step에서 library cache miss 횟수. Oracle statement block

                                reparse하고, object definition reload.

 

SELECT SUM(pins) "Executions",

SUM(reloads) "Cache Misses while Executing"

FROM v$librarycache;

·            전체 reloads 0 가까와야 한다.

 

Reducing Library Cache Misses

·            library cache memory 할당하기 위해 SHARED_POOL_SIZE  늘려준다.

·            할당된 memory 사용하기 위해, session마다 허용되는 cursor수를 증가시킬 필요가 있다. OPEN_CURSORS 늘려 준다.

·            가능한한 같은 SQL문장을 사용한다.

·            CURSOR_SPACE_FOR_TIME option 사용하여 performance 높일 있는데,이것은 Shared SQL area 새로운 SQL문을 위한 space 만들기 위해 언제  deallocate 있는지 결정한다.

FALSE=> 관련된 cursor 여전히 open 있는지 상관없이 deallocate

있다.

TRUE => 관련된 모든 cursor close될때까지 , shrared sql 영역과 private sql영역이

deallocate 없다. performance 조금 향상시킬 있다.

Shared pool size user 할당된 private sql area 충분하지 않으면 TRUE setting하지 마라.

 

Tuning the Dictionary Cache

data dictionary cache performace monitor, improve 있다.

 

Examing Data Dictionary Activity

instance startup시에는 dictionary cache 어떤 data도없으므로, 모든  SQL문장이 Miss 야기한다. 하지만 점차 data cache되어 결국 'steady state' 된다.

 

V$ROWCACHE View

다음의 column 들이 data dictionarary cache 효과적 사용을 나타낸다.

PARAMETER                           data dictionary 특정 item 나타내는 것으로, 'dc_' 시작

 된다.ex) file description (dc_files)

GETS                       해당 item 요구하는 total number

GETMISSES                               cache miss total 횟수

 

SELECT SUM(GETS) " DATA DICTIONARY GETS"

SUM(GETMISSES) " DATA DICTIONARY GET MISSES"

FROM V$ROWCACHE;

·            GET 대한 GETMISSES 비육일 10%,15%이하여야 한다.

 

Tuning the Shared Pool with the Multi-Threaded Server

 

multi-threaded server architecture에서는 Oracle session정보를 user process memory 아닌 shared pool 저장한다. Session 정보를 private SQL area sort area 포함한다.

그러므로 multi-threaded server architecture에서는 session정보를 수용하기 위해서 shared pool memory 증가시켜 준다.

 

V$SESSSTAT table

다음의 statistic session memory 사용을 측정하는데 유효하다.

SESSION MEMORY                  session별로 할당된 momory bytes

MAX SESSION MEMORY                          session 할당되었던 memory max

 

Querying the V$SESSSTAT

multi-threaded 하면 shared pool 얼마나 크게 늘려 주어야 하는지 결정한다.

 

SELECT SUM(value) || ' bytes' "Total memory for all sessions",

FROM v$sessstat, v$statname

WHERE NAME = 'session pga memory'

AND v$sessstat.statistic# = v$statname. statistic#;

·            session dedicate server 연결되어 있다면 memory user process 부분이지만, 그렇지 않으면 shared pool 부분이다.

 

Tuning the Buffer Cache

 

buffer cache peroformance monitor하고 향상시킨다.

 

Examing Buffer Cache Activity

V$SYSSTAT 정보를 저장하는데 select any table권한이 있는 사람만 query 가능하다.

DB BLOCK GETS,   data request 횟수. 이는 memory buffer access 횟수   CONSISTENT GETS               포함

PHYSICAL READS  data 얻기 위해 disk datafile access 횟수

 

SELECT name, value

FROM v$sysstat

WHERE name in ( 'db block gets','consistent gets','physical reads');

 

HIT Ratio=1-(physical reads / ( db block gets+consistent gets))

·            hit ratio 낮다면 DB_BLCOK_BUFFERS 늘려 주어 data bufffer size 크게 있다.

 

X$KCBRBH Table

cache 크게 함에따라 cache hit 증가율을 본다.

DB_BLOCK_LRU_EXTENDED_STATISTICS 정의한 값만큼의 row수에 대한 통계를 모은다.

 

SELECT 250*"TRUNC(indx/250)+1||'  to '||250*(TRUNC(indx/250)+1)

"Interval", SUM(count) "Buffer Cache Hits"

FROM sys.x$kcbrbh

GROUP BY TRUNC(indx/250);

 

interval                    Buffer Cache Hits

1             to   250                    16080

251  to  500                           10950

501  to 750                              710

751  to 1000                            23140

 

The X$KCBCBH table

buffer 감소시킴에 따라 cache hit 감소하는 비율.

특정 구간 감소때 cache hit비율이 급격히 낮아지면 감소되지 않은 buffer size 유지할 있다.

 

 

Tuning I/O

 

Monitoring Disk Activity

V$FILESTAT view query 있다.

PHYRDS                                    datafile 읽은 횟수

PHYWRTS                                datafile write 횟수

 

SELECT name, phyrds, phywrts

FROM v$datafile df , v$filestat fs

WHER df.file#  = fs.file#

 

·            하나의 disk total I/O disk상의 instance 모든 datafile I/O 합이다.

disk I/O 분산시키는 것이 좋다.

 

Distributing I/O

·            datafile redo log file 각기 다른 disk 분산

·            table data 각기 다른 disk "stripe"

·            table index 각기 다른 disk 분산

·            Oracle 관련되지 않은 I/O감소

 

 

Datafile Redolog file분산

가능한 file 분산하고, LGWR wating없이 Redo Log File access 수있도록 redo log file datafile 따로

"Striping " table data

CREATE TABLESPACE stripetblspace

DATAFILE 'file_on_disk1' SIZE 500k,

DATAFILE 'file_on_disk2' SIZE 500k,

DATAFILE 'file_on_disk3' SIZE 500k,

DATAFILE 'file_on_disk4' SIZE 500k;

 

CREATE TABLE stripetable

col1   number(2)

col2   varchar2(10)

TABLESPACE stripetblspace

STORAGE ( INITIAL 495K NEXT 495K MAXEXTENTS 5 PCTINCREASE 0 )

 

Allocating Space in Data Blocks

 

best performance 위해 data block 어떻게 관리하나?

 

Migrated and Chained Rows

·            Update block migration chaining 야기 시킬 있다.

·            migrated or chained row query하는데는  많은 I/O 일어나다.

 

 table cluster chaining check하기 위해서는

ANALYZE TABLE tablename LIST CHAINED ROWS  option 사용하고 ,

결과는 CHAINED_ROWS(UTLCHAIN.SQL script 생성) 저장된다.

 

Select *  from chained_rows where table_name = 'ORDER_HIST';

 

OWNER_NAME   TABLE_NAME  CUST  HEAD_ROWID            TIMESTAMP

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

SCOTT        ORDER_HIST   ..........   0000186A.0003.0001   04-AUG-92

 

CREATE TABLE  int_order_hist

AS  SELECT

               FROM order_hist

               WHERE ROWID IN

                                ( SELECT head_row_id

                                 FROM chained_rows

                                WHERE table_name = 'ORDER HIST')

chained row 모아 임시 Table 만든 후에 원래 Table에서 chained row record 삭제 한다.

DELETE FROM order_hist

WHERE ROWID IN

                                ( SELECT head_row_id

                                 FROM chained_rows

                                WHERE table_name = 'ORDER HIST')

임시 table row 원래 table 다시 insert한다.

INSERT INTO order_hist

SELECT *

FROM int_order_hist;

 

T

Tuning Contention

 

Reduding Contetion for Rollback segments

v$WAITSTAT view block contention 대한 정보를 얻을 있다.

SYSTEM UNDO HEADER                          SYSTEM ROLLBACK Segment  head block

                                                                    함하는 buffer 기다린 횟수

SYSTEM UNDO BLOCK                            SYSTEM ROLLBACK Segment blcok 포함하

buffer 기다린 횟수

UNDO HEADER                       기타ROLLBACK Segment  head block

                                                                    함하는 buffer 기다린 횟수

UNDO BLOCK                                            기타 ROLLBACK Segment blcok 포함하

buffer 기다린 횟수

 

SELECT class, couunt

FROM v$waitstat

WHERE CLASS IN ( 'system undo header','system undo block','undo header','undo block');

·            class wait 값의 전체 buffer request(db block gets, consistent get) 대한 비율이 1%이상이면 많은 rollback segment 고려 해야 한다.

 

Reducing Contetion for Redo Log Buffer Latches

 

Space in the Redo Log Buffer

LGWR redo log entry  buffer 부터 redo log file write할때, USER PROCESS disk 씌여진 entry위에 새로운 entry copy한다. LGWR 일반적으로 buffer 새로운 entry 위한 space 항상 있을 만큼 충분히 빨리 write한다. 

V$SYSSTAT 정보를 check 있다.

SELECT name, value

FROM v$sysstat

WHERE name = 'redo log space requests';

·            값이 거의 0 가깝다. 값이 지속적으로 증가하는 것은 process buffer space 기다린다는 뜻이다. Redo log buffer size LOG_BUFFERS 의해 결정된다. DB_BLOCK_BUFFERS 배가 되는 것이 좋다.

 

Redo Log Buffer Latches

redo log buffer access latch 의해 통제된다. type latch redo log buffer에대한 access control한다.

·            redo allocation latch

·            redo copy latches

 

Redo Allocation Latch

                                        Oracle user process buffer space 할당하기 위해서 redo allocation latch 얻어야 한다. 하나의 redo allocation latch 있기 때문에 ,한번에  하나의 user process space 할당할 있다.

                                        User process allocation latch 보유하는 동안 , entry buffer copy 있고 , copy후에 latch 풀어 준다.

                                        Redo allocation latch copy 있는 redo entry 최대값은

                                       LOG_SMALL_ENTRY_MAX_SIZE 의해 정해진다.

Redo Copy Latches

                                        redo entry redo allocation latch copy하기가 너무 크면 , user process redo copy latch 얻어야 한다.  여러개의 CPU 있다면 redo log buffer 다수의 redo copy latch 가질 있고, 이것은 여러 process redo log buffer 동시에 entry copy 있도록 한다. Redo copy latch 수는 LOG_SIMUTANEOUS_COPIES 의해 결정되고, 기본값은 CPU수와 같다.

 

Examining Redo Log Activity

V$LATCH check해서 redo log buffer contention 있다

 

                                        다음과 같은 type latch  request 있다.

                                        Willing-to-wait                          latch 가용하지 않으면 process latch 얻을 때까지 기다

린다.

Immediate                                  latch 얻지 못하면 기다리지 않고 진행한다.

Will-to-wait 관련해서

GETS                       latch 성공적으로 얻은 Will-to-wait request

MISSES                    willing-to-wait 처음 latch얻는데 실패한 횟수

SLEEPS                    Process 기다려서 latch 얻을 때까지 기다린 횟수

·            세번째에 latch 얻는데 성공했다면, GETS 1, MISSES 1, SLEEPS 2이다.

Immediate requests 관련해서

IMMEDIATE GETS         latch 성공적으로 얻은 immediate request

IMMEDIATE MISSES      latch 얻는데 실패한  immediate request

 

SELECT ln.name, gets, misses, immediate_gets, immediate_misses

FROM v$latch l, v$latchname ln

WHERE ln.name IN ('redo allocation','redo copy')

AND ln.latch#=l.latch#;

·            GETS MISSESS 1% 넘으면  redo log buffer 조정할 필요가 있다.

·            redo allocation latch  contention 줄이기 위해, 하나의 process latch 가질 시간을 단축시킬 있다. LOG_SMALL_ENTRY_MAX_SIZE 값을 줄이면 된다.

·            redo cop latch contention 줄이기 위해서는 LG_SIMUTANEOUS_COPIES 수를 늘이면 된다.

 

Reducing LRU Latch Contention

SMP(symmetric multiprocessor) machine에서는 LRU latch contention performance를저하시킬 수도 있다.  LRU latch buffer cache에서의 buffer 교체를 control한다.

DB_BLOCK_LRU_LATCHES 기본값은 CPU 수의 반이다.

Single process mode에서는 Oracle 자동으로 하나의 LRU latch 사용한다.

 

 

Tuning Sorts

Oracle sort 관한 정보를 V$SYSSTAT 모은다.

Sorts(memory)                           disk temporary segment I/O 일으키지 않고 sort area

                                                  수용될 만큼 충분히 작은 sort횟수

Sorts(disk)                                  너무 커서 disk temporay segment I/O 일으킨 sort

 

SELECT name, value

FROM v$sysstat

WHERE name IN ('sorts(memory)','sorts(disk)');

·            disk 횟수가 너무 크면 SORT_AREA_SIZE 증가시켜 있다. Sort size

하면, 한번에 sort되는 size 커서 횟수는 줄게 된다. 만큼 performance 좋아 있지만, private SQL and PL/SQL area memory 감소될 지도 모르고, paging이나 swaping일어날 수도 있으므로, 그전에 사용가능한 memory 확인해야 한다.

·            index 생성할때 table 오름차순으로 정렬되어 있으면 sort작업 없이 빨리 index 만들 있다.

Create index emp_index ON emp(ename) NOSORT;

 

.

Recreating Index

index내의 fragment 없애기 위해, 또는 storage parameter 조정하기 위해 Index 새로 만들려고 하면, 기존의 Index 사용할 있다.

기존에 NAME, CUSTID, BALANCE칼럼에 index 있으면, index 사용하여 다음의 같은 이름의 INDEX 만들 있다.

Create index I_CUST_CUSTNO on CUST(NAME, CUSTID)

또한 Storage 변경하고 싶으면 ALTER INDEX REBUILD명령어를 사용할 있다.

ALTER INDEX indx_name REBUILD STORAGE ( )...

 

 

Reducing Free List Contention

free list 대한 contention buffer cache안에서의 free data block contention 나타낸다.

V$WAITSTAT query 있다.

SELECT class, count

FROM V$waitstat

WHERE class = 'free list'

 

·            전체 request(db_block_gets + consistent_gets) 대해 free list wait 1%이상이면 free list 크게 잡아 table 만들 있다.

 

 

Tuning Checkpoint

checkpoint Oracle 자동적으로 수행하는 operation이다.

checkpoint DBWR 하여금  File write 하도록 한다.

checkpoint 빈번히 일어나면, 중간에 변화가 크지 않아 recovery 시간을 단축시킬 있다. LOG_CHECKPOINT_INTEVAL, LOG_CHECK_POINT_TIMEOUT으로 빈도를 조절할 있다.

 

 

Planning for your Database Growth

 

Growth Profiles

Table Tuning 하기 위해서는, data 의해 사용되는space, data 지속성 정도(volatility), data증감 비율(growth rate of data)등의 요소를 고려 성격에 따라 catagory 있다.

 

1.Business reference tables

·            business 위해 reference 있는 data  (ex: MTL_SYSTEM_ITEMS)

·            growth rate 작다.

·            table 작으면, full-indexed table이나, cached table 고려한다.

 

2.Application Reference Tables

·            data integrity reference 위한 valid code list같은 reference data( ex :TEMPERATURE_CODES)

·            create table TEMPERATURE_CODES

( temp_code   VARCHAR2(1) primary_key,

description   VARCHAR2(25));

3) temp_code 병행하여 description 자주조회하고자 할때는 concatentaed index

만들어  full table scan 막는 것이 좋다.

Create index I_TEMP_CODE$CODE_DESC

on TEMPERATURE_CODES(Temp_code, Description);

2)     table memory상에 두기 위해, cached table mark

alter table TEMPERATURE_CODES cache;

 

4.Business Transaction Tables

·            Application에서 생기는 transaction 저장

·            delete, insert 많기 때문에 business transaction 그대로이나, index size 늘어남 => Index stagnation

 

5.Temporary/Interface Tables

·            Highwatermark (고수위선) 높아질 가능성이 많아 check 필요가 있다.

·            Highwatermark 높으면

6) SQL*Loader 하면 Highwatermark에서부터 data insert되는데 space 아끼기 줄이기 위해서는, truncate 사용해 highwatermark reset한다.

7) Full table scan 할때 highwatermark까지 읽어, 실제 data 읽는 시간보다 많이 시간이 소요된다.

 

 

Memory and CPU Tuning Issues

 

Data Access Needs

data access하는 형태로 두가지 catagory,  OLTP & BATCH 나눌 있다.

 

1.OLTP Data Access Needs

OLTP Application Performanace 높이기 위해 세가지 특징을 기억한다.

·            data block buffer cache data 읽음으로서 physical IO 감소. data block buffer hit ratio 높아야 한다.

 

    * hit ratio - data disk대신에 memory에서 읽어지는 비율

1) 90%  hit ratio => disk 다시 쓰이기 전에  data block cache 있는 data 9번은 읽힌다.

 2) fully indexed table full scaned table보다 buffer 오래 지속

·            table이고, 변화가 없을때 효율적

3) How To Calculate Hit ratio

v$sysstat view 정보

Hit ratio =       ( consistent gets + db block gets ) - physical reads

--------------------------------------------------------------  * 100

consistent gets + db block gets

4) Hit ratio 영향을 주는 factor

b) Query문이 SGA에서 object 찾지 못하면, object 대한 info 얻기 위해 recurcive query 일으킴.  table 작고, 자주 사용되는 것은cache하는 것이 좋다

.(alter table tbl_name cache)

c) table scan 통해 읽은 block data block cache 오래 지속되지 않는다.

full table scan block 한번의 consistent get 갖고, index scan row 몇번의 consistent get 갖는다.

d) temporary segment 사용하지 않도록 SORT_AREA_SIZE 충분히 한다.

 

 

·            shared SQL area parsed version SQL commands 저장하도록 memory 충분히 하고, 표준화된 SQL문을 사용한다.

·            index 사용하는condition으로  query 하면 효과적이다.

 

2.      BATCH  Data Access Needs

·            multiblock reads

1) db_block_size(바꿀 없슴. 바꾸려면  data export DB recreate )

db_file_multiblock_read_count(바꿀  있음) 의해 결정

ex) db_block_size = 4k ,  multiblock_read factor 8이면,

한번에 buffer 읽혀 지는 양은 64k이다.

·            database block size(default 2k) 크게 하면 OLTP BATCH Job  Performance 높임

 

 

Hardware Tuning Issues

 

1.External Space used by Oracle

·            v$log_history query 해서 너무 빈번하게 log switch 되면 redo lod size늘려준다.

 

2.Identifying I/O Bottleneck

·            v$filestat   각각의 file 대한 IO 검색해서, load 분배한다.

·            DBWR 충분히 available하지 않으면. Init.ora DB_WRITERS = 조정해 준다.

 

3.Data Striping

·            alter table TEST allocate extent

( datafile '/d02/oracle/DEV/data_1b.dbf'); 

table extent 특정 datafile assign함으로서 data stripe 있다.

 

4.RAID Technologies

raid level disk physical stripe 구현할 있다.

·            RAID -1      - 1-to-1 disk mirroring

·            RAID - 0+1   - a combination of striping and mirring

·            RAID - 5     - Block Striping with distributed parity

Raw Devices and File Systems

Disk drivepartition할때 file system 만들거나, raw device 남겨놓을 있다.

 

Managing Space Inside Databases

 

1.Managing Extents

·            extent '근접한 datablock' 말한다.

·            segment 가질수 있는 extent maximum number 한계는 block size 따라 다르지만 , 7.3 이후로는 unlimited 정의 수도 있다.

·            한번에 읽을 있는 block수는 db_file_multiblock_read_count operation system's read buffer    limitaion 의해 결정

·            extent size multiblock size multiple이어야 불필요한 Physical I/O 없다.

그러므로 table extent갯수는 extent size multi read count 배수 이기만 하면 full tabel scan performance 영향 없다.

 

2.The benefit of Multiple Extents

·            하나의 single extents 가지면 관리는 쉬우나, unix상에서의 stripe 쓰지 않으면

I/O operation 분산시키지 못한다. Parallel Query option I/O Bottle 야기 시킬 있다.

 

3.Managing Tables

·            table volitile(휘발적)하다면 highwatermark 관리할 필요가 있다.

 

* Highwatermark : record 저장된 highest block

highwatermark 관리하는  방법

4) table analyze 후에 table block 고수위선을 구할 있다.

analyze table SALES compute statistics;

·            allocated block query  한다.

select blocks

from dba_segments

where owner = 'APPDEMO' and segment_name = 'SALES' 

·            highwatermark위의 block(emptyp block) 구한다.

select empty_blocks

from dba_tables

where owner = 'APPDEMO' and segment_name = 'SALES'

 

HWM = DBA_SEGMENTS.block - DBA_TABLES.Empty_blocks - 1

 

2) 사용하지 않은 block deallocate 있다.

·            DBMS_SPACE 사용

dbms_space.unused_space('APPDEMO','FND_USER','TABLE', OP1, OP2..)

·            Alter Table command사용

Alter table XXX deallocate unused ;

4.    Inside the Blocks

·            block row수가 많을 수록 range scan이나 full scan 하는데 적은 block 읽을 것이다. So row density 높여야 한다. head부분size 쉽게  변하지 않으므로, free space 넓혀야 하는데 그러기 위해서는 block size 유리하다.

·            block pctfree space 충분하지 않으면, row 다른 block으로 migrate된다.

(default pctused size = 40%)

rew chain되면 block  I/O 많다.

 

5.    Clusters

·            Cluster 두가지 목적

1) 하나의 table 사용되었다면, cluster key 지정된  것에 의해 오름차수 sort되어 저장

2) 여러개의 table 같은 block 저장함으로서, join시에 읽는 block 수를 줄임

·            하지만 clustered table transaction 6~8배정도 늦다. 그래서  transaction 많은  table 사용하는 것은 좋지 않다.

 

6.    Managing Indexes

·            index values update되거나 delete되면 index안의 unusable space 증가되어 index stagnation 만든다. 이것을 해결하기 위해서는 index drop하고 recreate해야 한다. Fast index rebuild method 있다.

·            Create Index시에 unrecoverable 사용함으로서 log 만들지 않아, 후에 archive 사용해 recover 못하는 대신, index table creation속도를 높인다.

 

7.         Managing Temporary Segments

·            alter tablespace TEMP

default storage (initial 1M next 1M pctincrease 0

minextents 1 maxextents249)

pctincrease 0,  initial = next 정해주는 것이 좋다.

·            pctincrease 0이면 SMON 자동적으로 인접한 free extents coalesce하지 않는다.

Alter tablespace TEMP coalesce

 

8.                Managing Rollback Segments

·            transaction's rollback segment entry single extent 저장될 없으면 second extent wrap된다. Rollback segment extent cyclically하게 할당되고, 그래서 마지막 extent에서, 첫번째 extent active하지 않으면, 첫번째 extent 가고, 그렇지 않으면 segment 새로운 extent extend한다.

1)                        rollback segment만을 위한 tablespace 두고, file I/O 분산하라.

2)     모든 rollback segment size 같게.

3) initial = next, pctincrease = 0

4) wraping 막을 있도록 extent 크게

5) optimal에서 extend하지 않도록, optimal 크게

·            처음 rollback optimal 넘었을때 shrink하지않고, 두번째 optimal setting 넘었을때, optimal shrink.

·            optimal setting, extend, wrap, shrink 횟수등을 보기 위해 V$ROLLSTAT V$ROLLNAME query한다.

Select name, optsize, shrinks, aveshrink, wraps, extends

from V$ROLLSTAT, V$ROLLNAME

where V$ROLLSTAT.usn = V$ROLLNAME.usn;

·                  optimal size까지 축소 : alter rollback segment R2 shrink;

·                  large transaction 처리하기 위해서는 large rollback 필요.

large rollback 사용하지 않을 ,

alter rollback segment R_BIG offline

 

6.Managing Free Space

·                  tablespace create될때, 생성된 datafile 첫번째 block head block이고, 나머지 부분은

하나의 free extent 된다.

·                 DBA_FREE_SPACE query하면 freespace 시작점, byte, block등을 있다.

 

10.Defragmentation of segment

·              fragmented data segment performance problem뿐만 아니라, tablespace안의  space management

  상의 문제

·            segment fragment되면 , initital storage 수정 불가하므로, 알맞은  storage parameter 정해 table rebuild. 이를 위해서는 Emport/Import Utility 사용.

1) exp system/manager file=exp.dmp compress=Y grants=Y indexes=Y tables=(HR.T1,HR.T2)

% compress option :   현재 할당된 table space check , 그것을 새로운 inital extent

 잡고, export dump file 생성

11) 성공적이면 table drop

12) imp system/manager file=exp.dmp commit=Y buffer=64000 full=Y

     => 새로운 initial extent 가지고, 새로운 table 생성. inital datafile보다  크면 error

 

13.  Defragmentation of Free Extents

·            segment drop되어, extent deallocate되면, Oracle7에서는 SMON 정기적으로 응집.

(only if pctincrease is not 0)

·            if pctincrease = 0, 강제적으로 coalesce

ALTER TABLESPACE tablespace_name COALESCE

 

Monitoring

 

·            V$SYSSTAT

Query Processing

Transaction Management

Memory and CPU Usage  

Database Management

User Statistics

< Query Processing>

'Consistent Gets' :   1 .     consistent mode data retrieve하기 위해 block buffer  access하는 .

2. Table access through index시에 수치가 높다.

  'db block Gets'    :   1.      한번의 block get으로 얻을 있는  block

3.user-by-user basis에서 statistics 검색 : V$SESS_IO

'Physical Reads' :   1.     Multi block read든지, single block read 상관 없이 read block I/O마다 count.

4. SORT_DIRECT_WRITE TRUE AUTO set되어 있으면, temporary

segment 부터의 physical reads session sort area 직접 간다.

5. session-by-session별로 hit ratio 보기 위해서는 V$session V$sess_io query

'Physical Writes' :  1 disk write하기 위한 I/O . 쓰여진 block  count

 2. DB_WRITER 정함으로서 DBWR process수결정

' Write Requests'   :1. Write request physical write 비율은 한번의 write 몇개의 block 썼는

나타냄

' db block changes' :1. SGA 변화된 block.( Dirty list 있는 것을 제외). buffer 얼마만큼의

비율로 dirty되는 보여줌

' Consistent Changes'  :  cursor open되고 뒤에 update되어 old version block 가져 오는 횟수.

'Table Scans(short tables)' and 'Table Scans(long tables)'

: 7.3부터는 cache되었거나, 5 미만의 block 가진 table => short table

short table buffer cache 남아있기 쉽다.

'Sorts(Memory)' and 'Sorts(Disk)'

 : SORT_AREA_SIZE 작으면 temporary segment 사용

 

Transaction Management

 'Opened Cursors Current' : 현재 system Open cursor

'Opened Cursors Cumulative'

'User Commits' : commit되면 redo log disk 기록된다. User transaction rate 반영한다.

'User Rollback'

'Redo Log Space Requests' :  0 이면 LGWR db write 기다린는 뜻으로, LOG_BUFFER 늘려 주어야 한다.

 

 Memory and CPU Usage

'Recursive Calls' and 'Recursive CPU Usage'

'Data Dictionary Cache Load'

'Data Dictionary Maintenence'

'Object Allocation'

 

 Database Management

'Background Timeouts' : Oracle background process 위해 issue되는 tomeout

 'Message sent' and 'Message Received ' : back process간의 communication

Message sent => commit 마다, database connect open

'Enqueue Tomeouts' 'Enqueue Waits' 'Enqueue Request' 'Enqueue Release'

 :  locking 관련. Enqueue request => lock request

 enqueue release =>  time out request

 enqueue waits > 0 이면, ENQUEUE_RESOURCES 부족

'Buffer Waits' : select Class, Count  from v$waitstat;

 buffer contention type : 'data blocks' => buffer cache안에 modified block 너무 많아서 이므로,  

dbwr 수를 증가

 

 

PARALLEL Options

 

1. Parallel options

task 수행하기위해 여분의 system resource 사용해 다수의  process 일으킴. 다수의 CPU process 배분. Parallel model에서는 database 의해 multiple query server process create되고, query coordinates process load 분배하고, output user에게 return한다.

 

2.Parallel Query Processing for Table scan

user process database connect할때 background shadow server process 시작되고, full table scan operation 요구될때 background shadow process coodinator -+의해 지정

coordinator 작업을 분배하는데 , 분배는 table 근접한 block범위에 따라 결정. 그래서 hardware configuration 따라 같은 CPU or 다수의 CPU 에서 동시에 작업. 결과를 coordinator 모아서 user에서 return.

 

 

When All Else Fails: New and Improved Tuning Options

 

Performance-related Changes

 

1.Unrecoverable Actions:

·            create table as select, create index 할때 unrecoverable option사용

·            redo log entry 기록 안함

2.Dedicated Temporary Tablespaces

·            alter tablespace TEMP temporary;

3.Sort Direct Writes

·            SORT_DIRECT_WRITES : data SGA 쓰는 대신 temporary segments 기록

·            SORT_WRITE_BUFFER_SIZE : SORT_WRITE_BUFFER_SIZE TRUE SET되어 있을 경우, MEMORY 할당된 SORT BUFFER  SIZE

·            SORT_WRITE_BUFFERS : 할당된 BUFFER (2~6)

   

Oracle 7.3이후로 Object Administraion Changes

 

1.MAXEXTENTS UNLIMITED

: 7.3이전에는 MAX EXTENTS DB BLOCK SIZE 따라 달랐는데, 7.3부터는 UNLIMITED 가능하다.

 

2.DEALLOCATION OF UNUSED SPACE FROM TABLES AND INDEXES

ALTER TABLE COMPETITOR DEALLOCATE UNUSED KEEP 100K;

·            UNUSED SPACE 100K 유지하라.

·            그전에 우선 DBMS_SPACE.UNUSED_SPACE 사용해서 UNUSED SPACE 조사해야 한다.

 

3.FAST INDEX RECREATION

·            7.3이전에는 INDEX 새로 만드는 방법이 DROP시키고 새로 만드는 .

그런 경우 TABLE LOCK 걸어야 한다.

·            7.3에서는 REBUILD 사용 가능. 현재의 INDEX SOURCE 해서 INDEX RECREATE. PARALLEL이나 UNRECOVERABLE OPTION사용 가능.

·            ALTER INDEX COMPANY_PK REBUILD

STORAGE ( INTIAL 100M NEXT 50M PCTINCREASE 0)

TABLESPACE INDX_2;

 

4.DATABASE ADMINISTRATION CHANGES

·            RESIZABLE DATAFILES(AS OF 7.2)

CREATE TABLESPACE DATA

DATAFILE '/DB05/ORACLE/DATA01.DBF' SIZE 200M

AUTOEXTEND ON

NEXT 10M

MAXSIZE 250M;

·            SYS.FILEXT$ QUERY 있다.

 

5.DYNAMICALLY CHANGEABLE INIT.ORA PARAMETERS

7.3이후로 몇개의 PARAMETER DB RUNNING중일때 바뀌어 있다.

SESSION LEVEL DB RUNNING일때 변경 가능하고, SYSTEM LEVEL DB

다시 STARTUP되어야 한다.

ALTER SESSION SET PRATITION_VIEW_ENABLED=TRUE;

ALTER SYSTEM SET TIMED_STATISTICS=TRUE;

 

6.TABLESPACE COALESCE

DBA_FREE_SPACE_COLALESCED PERCENT_BLOCKS_COALESCED COLUMN 이상적으로는 100% 되어야 한다.

 

7.READ-ONLY TABLESPACE

BACKUP & RECOVERY 필요없는 REFERENCE DATA, HISTORICAL DATA, READ-ONLY LOOKUP DATA 저장되어야 하고, ROLBACK SEGMENT, SYSTEM-OWNED OBJECTS, TEMPORARY SEGMENTS READ-ONLY 되어서는 안된다.

 

8.SHRINKING ROLLBACK SEGMENTS

ALTER ROLLBACK SEGMENTS R1 SHRINK TO 15M;

 

9.STANDBY DATABASE(항상 recovery mode)

PRIMARY DATABASE COPY. PRIMARY DATABASE 의해 GEN ARCHIVE REDO LOG STANDBY DATABASE 적용이 되어, DISASTER시에 복구.

 

ALTER DATABASE CREATE STANDBY CONTROLFILE AS FILENAME;

ALTER DATABASE MOUNT STANDBY DATABASE [PARALLEL];

ALTER DATABASE RECOVER STANDBY DATABASE;

ALTER DATABASE ACTIVATE STANDBY DATABASE;

RECOVER STNDBY DATABASE;

 

MEDIA RECOVERY STATUS

V$RECOVERY_FILE_STATUS : RECOVERY DATAFILE, RECOVERY DATABASE 사용했을 경우 저장

V$RECOVERY_STATUS :

 

Additional Changes in Oracle 7.3

 

1.Comparing Replicated Tables

replicated environment 에서 있을때 각각의 replicated table copy 동일한지 check하는 Package DBMS_RECTIFIER_DIFF.

DIFFERNCES procedure 차이를 분석하고, RECTIFY procedure synchronous 하게 만든다.

 

2.Multi-Threaded Server

몇개의 server process 많은 clinet process 연결되어 memory, processing resource 줄인다. MTS에서 client process shared dispatcher process 연결되고, dispatcher router client 다음에 avaiableshared server process 요구한다. MTS client 하나나 그이상의 dispatcher, shared server process 연결시켜 주는 SQL*NET listener process 구성되어 있다.

MTS_DISPATCHERS(initials), MTS_MAX_DISPATCHERS(maximum)

MTS_SERVERS(initial server process), MTS_MAX_SERVERS

MTS_LISTENER_ADDRESS : connection info

MTS 사용되는지 보기 위해서는 BG Process ora_s0, ora_d0 있는 check

MTS 사용하면 SGA안에서 shared SQL area 증가

 

                                SQL TUNING

 

Explaining SQL Statement Tuning

 

1.Using the optimizers

·            init.ora에서 optimizer_mode 고치거나,

'alter session set optimizer_goal  = COST[ RULE, CHOOSE]' optimizer변경.

·            Rule-Based Optimizer

사용 가능하고, access level 높은 path 실행한다.

·            Cost-Based Optimizer

analyze 사용해, object 대한 statistics 얻어, 그것을 바탕으로 execution path 정한다..

1) commands table, index statistics 모음.

Analyze table COMPANY compute statistics;

=> table COMPANY 대한 통계 모은다.

=>DBA_INDEXES distinct_key column distinct key 정보를 가지고 있고,

DBA_TABLES Num_Rows column row 수에 대한 정보를 가진다.

2) System 에서 제공하는 Package 이용.

Execute DBMS_UTILITY.ANALYZE_SCHEMA('APPOWNER','COMPUTE'):

3) estimate statistics 단지 table 1064  row scan.

·            hybrid approach

OPTIMIZER_MODE =CHOOSE

 

2.Execution Plan

·            7.3 이후로는 ' set autotrace on' 사용하면, query후에 uxlplan으로 생성된 execution plan PLAN_TABLE 자동으로 execute plan 입력되도록 되어 있다.

  <Cf) plan_table create하기 위해 utlxplan.sql script 돌린다.>

ex)

set autotrace on

select COMPANY_ID, Name

from COMPANY

where State = 'VA'

connect by Parent_company_id = Prior Company_ID

start with Company_ID = 1;

 

FILTER

CONNECT BY

INDEX UNIQUE SCAN COMPANY_PK

TABLE ACCESS BY ROWID COMPANY

TABLE ACCESS BY ROWID COMPANY

INDEX RANGE SCAN COMPANY$PARENT

 

3.TKPROF

·            server process dump file tkprof 수있다.

·            init parameter  SQL_TRACE = TRUE 정의하거나,

SQL> ALTER SESSION SET SQL_TRACE = TRUE;  명령어를 사용해 server process dump file

trace되도록 한다. user dump destination 지정된 곳에 dump file 생긴다.

Ex)

        select * from  fnd_user. where user_name = 'AAA ';

        $ cd udump

        tkprof scm_demo_ora_15884.trc yhl.tkp explain=system/crocus;

 

    

Index Scan  vs Full Table Scan

 

1.Indexed Scans

·            Indexed scan multi-block-read 못하므로, index 생성 여부를 경우에 따라 판단하라.

 

<다음의 column index create하라.>

·            Table Data 10%미만으로 query 할때 유용.

·            Where절에 다른 function없이 자주 사용될때

·            high selectivity(many distinct column) 가지는 .

·            자주 reference되고, where조건과 join 사용되는

·            NULL value 많이 가지는

 

<다음의 column index create하지 말라.>

·            자주 modified될때

·            WHERE 절에서 function이나 operation 같이 사용될때

where CITY||'X' like 'TOKYO%'

where City is null

  where City!= 'TOKYO'

·            low selectivity 가질때

·            작은 table일때

 

 

 

* selectivity

selectivity     =     distinct row

 전체 row

·            selectivity 높을 수록 index 활용하면 좋다.

·            1000 record 있는 table distinct row 5 있으면, 하나의 distinct row 얻기

위해 index 200개의 row return한다. 이때는 full table scan 효과적이다.

그래서 index create하기 전에 index selectivity 조사하는 것이 좋다.

·            anaylze command index까지도 analyze하게 해주어, selectivity조사

 

select Distinct_keys

from USER_INDEXES

where Table_name = 'COMPANY'

and Index_Name = 'COMPANY$CITY';

 

select Num_Rows

from USER_TABLES

where Table_Name = 'COMPANY';

 

select Column_name, Num_Distinct

from USER_TAB_COLUMNS

where Table_Name = 'COMPANY'

 

·            Foreign Key Constraints and Updating

foreign key에서 child key update하려고 하면, parent key lock 건다. 그러므로 parent table 동시에 update하고 싶으면, Constraint disable하거나, Foreign index 생성시켜 index row lock 걸게 한다.

 

·            Index 사용안되는 상황

·            !=

·            IS NULL  or  IS NOT NULL

·            NOT IN with a list ( NOT EXIST 사용하는 것이 낫다.

선택된 column null value 포함하면 NOT EXIST 사용)

·            LIKE

 

2.Full Table Scans

disk 읽어 buffer 가지고 오는데, multi block 한번의 I/O 가져 있으므로 작은 table일때는 full table scan 낫다.

 

Clusters

Cluster안에 있는 table과는 별도로 생성한다.

 

1.Index Clusters:

·            Common column cluster key 가짐. key index 별도 생성해서 관리. 

·            Update, insert 보다Query 많이 하는 column 사용.

·            생성시에 "INDEX"라는 글자 적어줌.

·            Cluster생성후 cluster index, table생성, index생성후에 insert 가능

·            master, detail 관계의 table중에 master table access perfomance 중요하다거면 cluster에서 제외한다.

·            하나의 table cluster함으로서 같은 cluster key 가진 block 한꺼번에 access 있다.

·            하나의 row size 합이 여러 block 차지할만하면 cluster 피하라.

 

2. Hash Clusters:

·              같은 hash value 가진 모든 row 같은 data block안에 저장.

·              data 찾기 위해 어떤 block 뒤져야 하는지 결정하기 위해, 정의하는cluster key value위에  hash function 사용.

·              두개의 key value 같은 hash value 생성할때 Collision 발생한다.

·              Cluster key unique identifier(empno)이고, 획일적으로 분포되어 있으면, internal hash function 사용할 있다.

·              HASH IS 사용해서 hash column이나 expression 정의할 있다.

·              If cluster key < HASHKEYS then hash value = cluster key value.

·              If cluster key >= HASHKEYS then hash value = MOD(cluster key,HASHKEYS)

 

·              create cluster schema.cluster

pctfree

pctused

size ....  ( 하나의 hash key block에서 차지하는 bytes)

 ( size kaskkeys hash cluster blocks data storage 영향)

index

hashkeys ( cluster key )

hash is ( internal hash function 무시하기 위해 정의 (column or expression))

 

Optimization Approach

 

1.Join Methods

·            Nested Loops

=> join 조건중 하나만 index 가짐

·            Sort-Merge

=> 어떤 쪽도 index 가지지 않음. Equal condition에서만 사용

·            Cluster]

 

2.Data Retrieval Methods

·            Row address => ROWID access

·            HASH SCAN

·            INDEX CLUSER SCAN

·            INDEX SCAN

·            FULL TABLE SCAN

 

3.Cost & Rule Based

 

·            data dictionary referenced objects statistics 가지고, 그것이 path 결정하는데

사용되면 cost-based optimization.

·            choose 놓으면 statistics 있으면 cost based 아니면 rule based.

·            Cost-base Example

 

select ename

from employee

where deptno =3

and empno between 100 and 250

order by ename;

 

800rows,   10 rows per block.

DB_FILE_MULTIBLOCK_READ_COUNT =8 

6 department

empno starts at 1 and is unique

 

1. Full Table Scan       Cost = 80/8 = 10 block visits  ( Cost 선택 )

2. Scan of I_DEPTNO    Cost=0.17( 6/80)*80=14block visits

3. Scan of I_EMPNO     Cost=0.19 *80 = 16block visits(250~100/800~1)

 

·            Rule-based에선

Single-column index access full table scan보다 level 높기 때문에 , index scan한다.

 

·            Guidelines for Query Writing

1. Equal 조건 수행

2. OR (UNION ALL transform) 보다는 AND.

3. START WITH, CONNECT BY 사용하는 것을 피하고,쓰려면 columnindex 사용

4. DISTINCT 사용을 조심.

5. SYS.DUAL 사용을 조심.  Select sysdate, ename

6. query수를 줄이기 위해 DECODE사용

 

·            Using HINTS

SELECT  SOLDIER_NAME

FROM  BATTALION

WHERE GENDOR = 'F';

 

INDEX SCAN : CLUSTER/DISTINCT = 1000/2 =500

FULL TABLE SCAN : TOTAL BLOCKS/MULTI BLOCK READ = 1000/8=125

 

SYSTEM FULL TABLE SCAN 하려 하나, 1000 ROW 10개의 'F' ROW FETCH하는 것은 인덱스를 사용하는 것이 유리.

 

SELECT /*+INDEX (battalion I_gendor) */

soldier_name

FROM battalion

WHERE gendor = 'F';

 

·            cost-based approach 해야 하는데, statistics 없을때 ALL_ROWS FIRST_ROWS hint사용

SELECT /*+ALL_ROWS */

ename

FROM emp WHERE empno = 7566

 

·            Response time optmize하려고 할때

SELECT /*+USE_NL(emp) */  => emp table nested loop inner table 사용

dept.loc,  emp.ename

from emp, dept

 

4.Types of PL/SQL Block

 

·            Anonymous Blocks

Database Triggers같은 A.B SGA 보관되지 않고, load될때마다 recompile.

Trigger 필요시에만 실행되기 위해 WHEN clause사용

·            Procedure and Functions

network traffic 줄이고, execution time 줄인다.

 

'OraclE' 카테고리의 다른 글

control file 재생성  (0) 2008.12.12
init<SID>.ora와 pfile,spfile의 차이..  (0) 2008.12.11
How to Relink Oracle Database Software on UNIX  (0) 2008.11.20
relink  (0) 2008.11.20
옵티마이저와 신나게 노는 방법(엔코아)  (0) 2008.11.06