2. - 1일차 : Tuning 도구
- D/B Tuning이 어려운 이유
- Oracle D/B 구조
- Tuning Tools : AutoTrace, SQL*Trace, V$SQLAREA
- 2일차 : SQL Tuning #1 : Optimizer
- Rule-based Optimizer
- Cost-based Optimizer
- 통계정보, Histogram
- Hint
- 3일차 : SQL Tuning #2 : Index, Join
- Index
- Join
- 4일차 : Server Tuning
- Shared pool tuning
- Data buffer cache tuning
* NoSQL 소개
3. Database Tuning의 원인과 결과
CPU Memory I/O Network Software
설계 Design/Architecture O O O O O
Coding
DML SQL O O O O O
Query SQL O O O O O
Client/Server Roundtrips O O
D/B 관리
Buffer Cache O O O
Shared Pool O O
Sort Area O O O
Physical Datafile I/O O O
Logfile I/O O O
Archiver-File I/O O O
Undo Segments O O
Locking O O O O
Backups O O O O
Infra
( OS +
Network)
O/S Memory Manage O O O
O/S I/O Manage O O O
OS Process Manage O O
Network Manage O O
4. Database Tuning이 어려운 이유
개발자
- SQL Tuning 만 한다.
DBA
- D/B Tuning 만 한다.
Server Admin
- Server, OS 관리만 한다.
분석/설계자
- 보통 문제는 설계가 다 끝난 후 생겨서
다시 불러서 뭐라 하기가 쫌…
(그리고 무엇보다도… 부를려니… 비싸.)
슈발자
- 모든 면에서 문제를 파악해서
궁극적으로 해결이 가능한
슈발자 (슈퍼 개발,관리자)가 있다면…
과연 있을까 ???
5. Process 영역
User Process, Server Process, Background Process
Memory 영역 (SGA)
Shared pool , Data buffer cache , Log buffer, Large pool
File 영역
Control file, Parameter file, Tablespace file, Redo-log file
Oracle D/B 구조
6. Server용 Tablespace
- SYSTEM : Dictionary tables, Meta tables, System tables
- UNDO : Transaction 변경 내용의 임시 공간
- TEMP : 2차 가공용 임시공간 ( ORDER BY , GROUP BY )
Tablespace 설계시 유의사항
- 사용자의 Data를 Server용 Tablespace에 생성하지 마세요.
(System table에서는 항상 엄청난 DML 연산이 일어나고 있습니다.)
- Table과 Index의 Tablespace를 분리하세요. (Block size를 다르게 설정하면 좋아요.)
- 각 Data Tablespace를 분리하면 I/O 경합을 줄일 수 있어요.
- 대용량 Sorting 작업용 TEMP Tablespace를 해당 작업 또는 사용자 만큼
분리하여 할당하세요.
Tablespace
7. Check
Tablespace Fragmentation
SELECT TABLESPACE_NAME, TOTAL_EXTENTS, PERCENT_EXTENTS_COALESCED
FROM DBA_FREE_SPACE_COALESCED
WHERE PERCENT_EXTENTS_COALESCED <> 100;
Solution
1. 빈 공간을 합병
2. Table 생성시 미리 충분한 공간으로 할당
INITIAL, NEXT, MINEXTENTS, MAXEXTENTS, PCTINCREASE 값을 충분히 예상한 후 할당
3. 사용되지 않는 저장공간을 Disk로 반환
ALTER TABLESPACE USERS COALESCE; (한번에 100%가 되진 않으니 여러 번 반복)
ALTER TABLE BIG_EMP DEALLOCATE UNUSED;
9. AUTOTRACE
SET AUTOTRACE [ ON | OFF | TRACE ]
- TRACE : 실행계획, 통계정보
- OFF : 실행결과
- ON : OFF + TRACE 모두
Statistics value
recursive calls 해당 SQL을 실행하기 위해 읽은 Dictionary의 Block
db block gets current mode의 block을 읽은 수 (수정될 값을 읽음)
consistent gets query mode 의 block을 읽은 수 (consistent 보장)
physical reads disk에서 읽은 block 수
redo size 사용한 redo block
sorts (memory) 사용한 temp block (memory)
sors (disk) 사용한 temp block (disk)
rows processed 읽은 row 수
10. SQL*TRACE + TKPROF
trace 파일 위치 확인
ALTER SESSION SET SQL_TRACE = TRUE;
SELECT * FROM SCOTT.EMP;
EXIT
SHOW PARAMETER BACKGROUND_DUMP_DEST;
Trace 실행
TKPROF로 읽기 편하게 분석
> TKPROF ORCL_ORA_15196.trc T15196.tkf SYS=NO
EXPLAIN = SYSTEM/***
실행계획 보는 법은 각자 쫌…..
12. V$SQLAREA
SELECT sql_text, version_count, loads, invalidations, parse_calls, sorts , disk_reads, buffer_gets
FROM V$SQLAREA
WHERE sql_text NOT LIKE '%$%' AND command_type IN (2,3,6,7)
ORDER BY parse_calls DESC;
Column value
sql_text SQL 문장
version_count 해당 문장을 실행한 사용자 ID 수
loads Parsing후 SQL문이 Memory로 Load된 수
invalidations Parsing후 해당 Table이 ALTER, DROP, ANALYZE 되어 재사용할수 없음
parse_calls 최초 Parsing후 재사용된 수
sorts 수행된 Sorting 수
command_type Oracle command type : 2 (insert), 3 (select), 6 (update), 7 (delete)
disk_reads DISK-I/O를 유발과 관련된 수
buffer_gets Buffer cache를 사용과 관련된 수
두 항목이 높은 순으로 Top 10 으로 조회한 뒤 Tuning
14. WHERE절의 상수값, Bind Variable 만 다른 경우도 SQL Parsing 결과 공유
CURSOR_SHARING
SELECT sql_text, version_count, loads, invalidations, parse_calls, sorts
FROM V$SQLAREA
WHERE sql_text LIKE 'SELECT * FROM SCOTT.DEPT WHERE DEPTNO = %' AND
command_type = 3
ORDER BY parse_calls DESC;
검사용 SQL
ALTER SYSTEM SET CURSOR_SHARING = [ EXACT | SIMILAR | FORCE ]
SET value
EXACT 모든 조건이 일치해야만 공유
SIMILAR 바인드 변수가 다른 값을 가지더라도 공유
FORCE 상수가 다르더라도 공유