by 오뚝이 [Oracle Admin] sga sga_max_target memory_max_target memory_target asmm [2018.06.18 16:12:32]
안녕하세요.
개발에서 운영으로 보직 변경(?)을 해서 하루 하루가 헬~인 개발자 입니다. ㅜㅜ
온라인 쇼핑몰을 운영중입니다.
Windows Server의 총 메모리 용량은 32G인데 사용 용량은 7.2G 정도입니다.
(메모리 25Gb 정도가 놀고 있는데~ㅡㅡ)
개발자 입장에서(??) DB가 빠르진 않은데
SQL에서 범위검색, GROUP BY 등 다건의 데이터를 조회시 유독 느려지는 현상이 있습니다.
대용량 데이터는 없습니다.(100만건 이상)
주문+상품이 40만건 이하입니다.
그래서 SGA_MAX_SIZE 용량을 4G -> 16G로 늘리면 성능이 좋아질까? 싶은데요~~
DB를 잘 모르는 상태에서 진행하려니.. 불안합니다.
아래 정보 드리니 가르침 부탁드립니다.
1. 정보
1) Server 정보
Windows Server 2012 Standard, Microsoft Windows NT 6.2.92, b4bit
2) Oracle 정보 (Standard)
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
2. 실행 명령어 (메모리 증가)
1) 메모리 변경
-- 11g는 SGA_MAX_SIZE, SGA_TARGET 대신 memory_max_target, memory_target 로 설정하는게 맞나요?
ALTER SYSTEM SET MEMORY_MAX_TARGET=16G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_TARGET=16G SCOPE=SPFILE;
-- 메모리 자동 관리하도록 변경
ALTER SYSTEM SET SGA_TARGET=0 SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=0 SCOPE=SPFILE;
2) 오라클 재기동 절차
(1) 리스터 종료
C:\> lsnrctl stop
(2) 오라클 종료
C:\> sqlplus "/as sysdba"
SQL> shutdown immediate
(3) 오라클 시작
C:\> sqlplus "/as sysdba"
SQL> startup
(4) 리스터 시작
C:\> lsnrctl start
-- 상태 확인?
C:\> lsnrctl status
C:\> lsnrctl services
3) 현재 실행중인 서비스(window 서비스에서 확인)
OracleServiceXXXXXX
OracleMTSRecoveryService
OracleDBConsoleXXXXXX
OracleOraDb11g_home1TNSListener
OracleJobSchedulerXXXXXX
OracleVssWriterXXXXXX
3. 문의사항
1) ASMM(Automatic Schared Memory Management), AWM(Automatic Workload Repository) 설정이 필요하나요?
2) 위 2.번 문장으로 실행하면 될까요?
3) 메모리 증가한다고 좋아질까요? ㅜㅜ
4) 어떤 dba가 잠깜 서버 검점을 했는데
Redo 로그를 처리할 수 있는 개수가 3개로 설정되어 있어 경합이 발생한다고 했었는데(로그파일 확인)
redo 로그 처리 개수를 증가하는 방법은 어떻게 되나요?
몇개로 증가시켜야 할까요? ㅜㅜ
4. 현재 설정된 정보 : 잘 모르니 이것 저것 다 올립니다.
1) 영역별 메모리 확인
select NAME, round(BYTES/1024/1024, 2)||'MB' as MEMORY from V$SGAINFO;
NAME MEMORY
---------------------------------------------
Fixed SGA Size 2.18MB
Redo Buffers 14.16MB
Buffer Cache Size 784MB
Shared Pool Size 1344MB
Large Pool Size 64MB
Java Pool Size 48MB
Streams Pool Size 16MB
Shared IO Pool Size 0MB
Granule Size 16MB
Maximum SGA Size 3488.35MB
Startup overhead in Shared Pool 405.09MB
Free SGA Memory Available 1216MB
2) 라이브러리 캐쉬 쿼리 히트율
SELECT NAMESPACE, GETS, GETHITS, GETHITRATIO FROM V$LIBRARYCACHE WHERE NAMESPACE = 'SQL AREA';
NAMESPACE GETS GETHITS GETHITRATIO
---------------------------------------------------------------
SQL AREA 1349751494 1348218551 0.998864277604571
3) 적정값 구하기(발췌 : http://clipper0317.tistory.com/1)
SELECT * FROM V$MEMORY_TARGET_ADVICE ORDER BY MEMORY_SIZE;
MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION
-----------------------------------------------------------------------------------
1752 0.5 53768377 1.2862 0
2628 0.75 42347509 1.013 0
3504 1 41804056 1 0
4380 1.25 41804056 1 0
5256 1.5 41804056 1 0
6132 1.75 41804056 1 0
7008 2 41804056 1 0
다양한 정보를 검토 후 최적의 상태로 설정해야 겠지만
어떤 정보가 얼만큼 필요한지 모르겠네요.. ㅜㅜ
부족한 정보로 문의 글을 올려 죄송합니다.
필요한 정보가 있으면 말씀해주시면 더 올리겠습니다.
감사합니다.
답변 감사드립니다.
먼저 답변에 말씀 드렸는데..
프로그램 개선과 SQL 튜닝 다양한 유지보수건이 있어 단기간에 SQL 튜닝을 마무리 하기에는 힘든 상황입니다.
개발해 놓은 SQL 품질이 않좋은 편입니다.
SELECT절, WHERE절에 EXISTS만 남발해 놓았네요 ㅜㅜ
한 SQL에 수십개의 EXISTS가 있는건 처음입니다. ㅋㅋㅋㅋㅋ
500라인 SQL 재 작성하며 튜닝하는데(잘은 못하지만. ) 5시간 걸렸습니다.
이젠 꼭 필요한 부분만 수정합니다. ㅡㅡ'
개발사는 개발만 해 놓구 나갔는데.. 난감하네요
앞으로 튜닝은 길게 보고 진행할까 합니다.