[DB] DB 성능관리와 튜닝 5일차
오늘은 정말 여유있게 식사를 해서 기분좋게 강의를 들으러 왔습니다.
설 연휴 준비를 위해 다들 일찍 들어가는 모습을 보았지만 불굴의 의지로 강의를 들으러 왔습니다.
EM으로 메모리 어드바이져 PGA확인
PGA의 세부정보를 더 보면 아래와 같습니다. 위에서는 적중률이 100%로 상당히 이상적인 수치임을 확인할 수 있습니다.
지금 권고사항을 확인하면 넉넉한 상황입니다.
<<실습>>
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 284M
SQL>
pga_aggregate_target이 설정되었으면 자동!!!
그럼 수동은 뭔가 하면...?
SQL> show parameter area_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size integer 1048576
create_bitmap_area_size integer 8388608
hash_area_size integer 131072
sort_area_size integer 65536
workarea_size_policy string AUTO
SQL>
위에는 지금 자동으로 되고 있지만 수동으로 바꾸면 위의 값이 아닌 sort_area_size integer 65536 로 잡히게 됩니다. (64K)
따라서 64K이상이면 Multipass가 발생할 수 있습니다. 그러면 성능이 저하되겠네요.
AUTO로 할 때의 장점은 위의 수동설정보다 훨씬 많은 값을 사용할 수 있습니다. 예를들어 64K를 위와 같이 쓴다고 할 때 PGA에 여유가 있으면 64K이상의 값을 사용할 수 있습니다. 수동으로 하는 것 보다 Temp ~ 에 가는것이 적어서 성능이 더 좋습니다.
PGA의 히스토그램도 볼 수 있습니다. 위의 통계정보를 계속 보면 아래와 같습니다.
위의 붉은 부분 이상이 되면 성능이 더 개선되지 않으므로 최적의 성능을 원한다면 저정도로 설정을 하면 되는것을 알 수 있습니다.
위의 보고서에서 Direct path read/write temp가 있는지 확인을 하여 튜닝을 할 수 있습니다.
WITH로 시작하는 SQL를 사용하는 것인 서브쿼리 펙토링을 설명해주셨습니다. 성능을 좋게하기 위해서 사용한다고 하셨습니다. 좋은 예제를 찾는데 시간이 좀 걸리셨고 Oracle문서에서도 바로 찾지 못하셨습니다.
subquery factoring 으로 구글에 검색을 하셔서 몇분동안 예제를 찾아보셨습니다.
subquery factoring 은 깊게 봐야 더 좋다고 하셨습니다.
한번 읽어온 자료를 다시 활용하려면 Sub query를 사용하거나 in line view를 만들어 주어야 하지만 WIth문을 써서 하면 또 읽는것을 막고 Temp Table Space에 있는것을 읽어서 성능을 높이는 방법을 써서 성능을 높일 수 있습니다.
Create Index를 하면 PGA WA(work area)에서 작업을 합니다.
이번에는 Table Space를 보겠습니다. 보통은 자동으로 계속 늘어나게 설정이 되어있고 자동으로 늘어나는 것이 위험할 수 있는데 작업을 하다가 잘못하여 자동으로 계속 늘어나 Full나게 되면 DB가 죽을 수 있습니다. (100%이해는 안되지만 강사님의 설명을 직접 옮겼습니다.)
그래서 Temp Table space를 생성해보겠습니다.
Temp table space를 여러개 성성하여 그룹으로 묶으면 한 사용자가 사용할 때 IO가 분산되어 좋은 성능을 발휘할 수 있습니다.
===================================== 2 ===========================================
오늘은 9시 이후에 개인 사정으로 10시까지 강의를 듣지 못할 수 있을 것 같습니다.
명절에 무엇을 할 지..... 흠.... 명절에는 TV 보고 자고 먹고.... 그럴 것 같군요.... 강사님께서도 비슷하신 것 같습니다.
SQL> show parameter memory_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 0
0인걸 보니 수동인 것 같습니다.
SQL> show parameter db_cache_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 0
SQL> alter system set db_cache_size=250m;
System altered.
SQL> show parameter db_cache_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 252M
EM에서 메모리권고자()를 다시한번 보겠습니다. 자동관리는 위의 파이그래프에 있는 항목들만 가능합니다. 다 더한값은 SGA 의 최대 사이즈를 초과할 수 없습니다.
위의 구성요소를 제외한 것들은 자동으로 늘거나 줄지 않습니다. 그 중에는 리두로그버퍼가 있습니다.
alter system set sga_target=0; -> 수동으로 설정함
SQL> show parameter sga_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 528M
2. 반자동 (script)
반자동은 하한값을 설정하되 서로 조절이 가능 하도록 정말 최저로 낮게 설정을 하여 변화가 유동적으로 되도록 하되 최 하한 밑으로는 내려가지 않도록 할 때 유용합니다.
ASMM을 사용하고 있는것을 확인할 수 있습니다.
SELECT component, current_size/1024/1024
FROM V$SGA_DYNAMIC_COMPONENTS;
COMPONENT
----------------------------------------------------------------
CURRENT_SIZE/1024/1024
----------------------
shared pool
152
large pool
4
java pool
4
streams pool
4
DEFAULT buffer cache
252
KEEP buffer cache
0
RECYCLE buffer cache
0
DEFAULT 2K buffer cache
0
DEFAULT 4K buffer cache
0
DEFAULT 8K buffer cache
0
DEFAULT 16K buffer cache
0
DEFAULT 32K buffer cache
0
Shared IO Pool
0
ASM Buffer Cache
0
14 rows selected.
SQL>
SQL> show parameter memory_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 0
SQL> show parameter memory_max_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_max_target big integer 812M
SQL> show parameter sga_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 424M
//설정값을 변경해보겠습니다.
SQL> alter system set memory_target = 812m;
System altered.
SQL> show parameter memory_max_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_max_target big integer 812M
SQL> show parameter memory_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 812M
재시작을 해야 바뀌는 값들을 확인하기 위해 강사님께서 DB를 재시작하는 것을 보여주셨습니다.
예를들면