Copyrightc2013 Altibase.corp All rights reserved ALTIBASE ADVANCE
ALTIBASE ADVANCE CONTENTS DBMS TUNING ALTIBASE OPERATION MONITORING TOOL TECHNICAL SUPPORT
3 / 166 ALTIBASE ADVANCE DBMS TUNING
4 / 166 DBMS TUNING CONTENTS DBMS TUNING SQL TUNING SQL PLAN SQL HINT ALTIBASE SERVER TUNING TRANSACTION TUNING DBMS STATS
5 / 166 DBMS TUNING DBMS TUNING
6 / 166 DBMS TUNING DBMS 튜닝이란? DBMS의성능향상을목적으로진행하는일련의작업 어플리케이션튜닝과 SERVER 튜닝으로나뉨 DBMS 튜닝목표 DBMS call을최소화 Prepare를최소화 디스크 I/O를최소화 CPU 사용률을최소화 관점에따른튜닝종류 Design 관점 Application 관점 DBMS SERVER 관점 OS 관점
7 / 166 DBMS TUNING DBMS CALL 최소화 어플리케이션에서 DBMS로호출하는횟수가많은가? DBMS call을최소화하여어플리케이션의성능을향상 DBMS CALL 최소화방법 array processing 으로처리 : Array 단위 Fetch, Bulk Insert / Update / Delete Fetch call 을최소화 : 부분범위처리, ArraySize 조정
8 / 166 DBMS TUNING DBMS CALL 최소화예제 APRE * C/C++ struct { char char char int double price[3]; } a_goods2; JAVA gno[3][10+1]; gname[3][20+1]; goods_location[3][9+1]; stock[3]; EXEC SQL INSERT INTO GOODS VALUES (:a_goods2); 1. array processing for( ){ pstmt.addbatch(); } pstmt.executebatch(); 2. Fetch call 최소화 stmt.setfetchsize(100);
9 / 166 DBMS TUNING PREPARE 최소화 PREPARE 비용 단순 SQL 처리시약 70% 정도가 Prepare 비용 DBMS call을최소화하여어플리케이션의성능을향상 PREPARE 최소화방법 C/C++/APRE* 프로그램작성시 bind 변수 Java 프로그램작성시 PreparedStatement를이용 SQL Plan Cache에적재되어있는 Execution Plan을재사용 실행계획을공유하지못해 PREPARE를다시수행하는경우 공백이다르거나줄바꿈이다른경우 주석이다른경우 힌트가다른경우 조건절비교값이다른경우 대소문자가다른경우
10 / 166 DBMS TUNING 디스크 I/O 최소화 디스크 DBMS I/O 디스크 DBMS는한건의레코드만읽어도 page 단위로 I/O가일어남 메모리 I/O vs 디스크 I/O 전기적인신호에의한입출력 속도가빠르다 Memory I/O Disk I/O 액세스 Arm 이움직이면서헤드를통해입출력 속도가느리다 디스크 I/O 최소화방법 자주 access 되는테이블은메모리테이블로구성 필요한최소 page 만읽도록 SQL 작성 Buffer hit 율증가 Random access 감소 Sequential access 증가 Single I/O page read 와 multi I/O page read 를고려한 SQL 이 index scan/ full table scan 중유리한쪽선택
11 / 166 DBMS TUNING CPU 사용률최소화 메모리 DBMS는 I/O 보다는 CPU사용률이튜닝 factor SQL 1개수행동안 CPU 1EA(100%) 사용 CPU 사용률최소화방법 메모리테이블은전체건수를 SQL 하는경우라도 full table scan 보다는 index scan 이빠름 index scan 을하도록 SQL 작성
12 / 166 DBMS TUNING 튜닝을위한점검사항 Application 관점 TRANSACTION 증가 매번 connect - disconnect 반복 SQL 실행시빈번한 prepare 수행 full table scan 등의오래수행되는 SQL lock을잡고있는 SQL ALTIBASE 관점 체크포인트 I/O logfile writing service thread 병목 메모리 ager buffer SQL plan cache OS 관점 OS 설정 디스크 I/O 성능
13 / 166 DBMS TUNING ALTIBASE 튜닝도구 Explain Plan Profiling Meta 테이블 & 성능뷰 OS 유틸리티 or 명령어 (ps, top, nmon, glance)
DBMS TUNING ALTIBASE 튜닝도구 Explain Plan SQL의실행계획을확인하고자할때설정 isql에서 EXPLAIN PLAN을설정후확인가능 SQL 수행후출력하며, plan tree와 access 횟수등을출력 isql> ALTER SESSION SET EXPLAIN PLAN = ON; Plan tree 출력하지않음 isql> ALTER SESSION SET EXPLAIN PLAN = OFF; SQL 수행하지않고 Plan tree 만출력 isql> ALTER SESSION SET EXPLAIN PLAN =ONLY; 14 / 166
DBMS TUNING ALTIBASE 튜닝도구 Explain Plan 예제 EXPLAIN PLAN = ON 설정 isql> ALTER SESSION SET EXPLAIN PLAN = ON; isql> SELECT eno, ename, salary FROM employee WHERE eno=1; ENO ENAME SALARY -------------------------------------------------- 1 EJJUNG 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 47 ) SCAN ( TABLE: EMPLOYEE, INDEX: SYS_C0011065, ACCESS: 1, SELF_ID: 2 ) ------------------------------------------------------------ EXPLAIN PLAN = OFF 설정 isql> ALTER SESSION SET EXPLAIN PLAN = OFF; isql> SELECT eno, ename, salary FROM employee WHERE eno=1; ENO ENAME SALARY -------------------------------------------------- 1 EJJUNG 1 row selected. 15 / 166
DBMS TUNING ALTIBASE 튜닝도구 Explain Plan 예제 EXPLAIN PLAN = ONLY 설정 isql> ALTER SESSION SET EXPLAIN PLAN = ONLY; isql> SELECT eno, ename, salary FROM employee WHERE eno=1; ENO ENAME SALARY -------------------------------------------------- No rows selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 47 ) SCAN ( TABLE: EMPLOYEE, INDEX: SYS_C0011065, ACCESS:??, SELF_ID: 2 ) ------------------------------------------------------------ 16 / 166
17 / 166 DBMS TUNING ALTIBASE 튜닝도구 Profiling 사용자가수행한 SQL 실행정보를수집하는기능 system level에서 property로설정 Profiling 된파일은 $ALTIBASE_HOME/trc 에저장됨 Profiling 으로저장되는정보 SQL를수행한 CLIENT 정보 SQL 처리의통계정보 실행시각 SQL 수행시간 인덱스정보 버퍼 / 디스크접근비용 실행계획
18 / 166 DBMS TUNING ALTIBASE 튜닝도구 Meta 테이블 데이터베이스객체에관한모든정보를기록하기위한시스템정의테이블 소유자는 SYSTEM_ ( 접속불가 ) DDL 수행시시스템에의해변경 성능뷰 인스턴스와성능관련정보저장 시스템메모리, 프로세스상태, 세션, 버퍼등의최신정보제공 read only
19 / 166 DBMS TUNING ALTIBASE 튜닝도구 OS 및 ALTIBASE 점검을위한 OS 명령어및유틸리티 AIX HPUX LINUX Solaris Performance monitor top topas nmon top glance top top System activity reporter sar sar sar sar Virtual Memory statistics vmstat vmstat vmstat vmstat I/O statistics iostat iostat iostat iostat Error log errpt dmesg dmesg emesg /var/adm/syslog
20 / 166 DBMS TUNING SQL TUNING
21 / 166 SQL TUNING SQL 처리절차 SQL PREPARE PARSING VALIDATION * syntax check * generate parse tree * semantic check * access meta table OPTIMIZATION * calculate cost/normalize * generate execution plan tree EXECUTE EXECUTION * execute execution plan tree * access table
22 / 166 SQL TUNING 디스크테이블과메모리테이블의 SQL 처리방법차이 Item Memory table Disk table Object identifier Pointer OID(RID) Buffer management N/A Limited buffer Join methods One-pass algorithms Multi-pass algorithms Main cost CPU Disk Index selection Minimize record access Minimize 디스크 I/O Cost factor T(R), V(R.a), etc + B(R), M T(R) : 테이블의레코드수 V(R.a) : 컬럼의 Value Cardinality B(R) : 테이블의 page 수 M : Memory Buffer 수 One- pass algorithms 가용메모리버퍼에중간결과를모두적재할수있을때사용 Multi-pass algorithms 중간결과를메모리상에모두적재할수없을때버퍼교체를최소화하기위해사용
SQL TUNING 인덱스 검색시성능향상을위해테이블과는별도로저장되는객체 인덱스대상컬럼값을 sorting하여저장 Memory Index 데이터베이스가구동될때마다 Memory 에생성 실제테이블의데이터에대한포인터만저장 (16 bytes) DML 시 Logging 을하지않음 Disk Index 인덱스생성시점에 Disk에생성컬럼의값과테이블의레코드주소값이저장 DML 시 Logging ALTIBASE 인덱스특징 UNIQUE, PRIMARY KEY 로지정한컬럼은내부적으로 Unique 인덱스가생성 테이블과별도의디스크에분리저장권고 Btree 인덱스와 Rtree 인덱스만지원 Rtree 인덱스는 Geometry 를위한다차원데이터처리시사용 Reverse, Bitmap, Global partitioned 인덱스등은미지원 23 / 166
SQL TUNING FUNCTION BASED INDEX 개념 6.3.1 버전부터제공 함수또는수식의결과값을기반으로생성하는인덱스 WHERE 절함수또는산술표현을자주사용시빠른검색속도보장 QUERY_REWRITE_ENABLE 1 로변경후인덱스사용가능 FUNCTION BASED INDEX 생성예제 isql> ALTER SESSION SET EXPLAIN PLAN = ON; Alter success. isql> CREATE INDEX NVL_IDX ON employee (NVL(salary, 0)); Create success. isql> SELECT eno, ename, salary FROM employee 2 WHERE (NVL(salary, 0)) < 1000000; ENO ENAME SALARY -------------------------------------------------- 1 EJJUNG 7 HJMIN 500000 8 JDLEE 13 KWKIM 980000 20 DIKIM 5 rows selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 35, COST: 0.31 ) SCAN ( TABLE: EMPLOYEE, FULL SCAN, ACCESS: 20, COST: 0.24 ) ------------------------------------------------------------ 24 / 166
25 / 166 SQL TUNING FUNCTION BASED INDEX 생성예제 isql> ALTER SESSION SET QUERY_REWRITE_ENABLE = 1; Alter success. isql> SELECT eno, ename, salary FROM employee 2 WHERE (NVL(salary, 0)) < 1000000; ENO ENAME SALARY -------------------------------------------------- 1 EJJUNG 8 JDLEE 20 DIKIM 7 HJMIN 500000 13 KWKIM 980000 5 rows selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 35, COST: 0.07 ) SCAN ( TABLE: EMPLOYEE, INDEX: NVL_IDX, RANGE SCAN, ACCESS: 5, COST: 0.00 ) ------------------------------------------------------------
26 / 166 SQL TUNING SEQUENTIAL ACCESS 레코드간물리적인순서에따라차례대로읽어나가는방식 FULL table scan 시레코드를읽는경우 인덱스리프노드에위치한데이터들을읽는경우 RANDOM ACCESS 레코드간순서를따르지않고한건의레코드를읽기위해한 page 씩접근하여읽는방식 인덱스에저장되어있는물리적인레코드의주소를참조하여테이블의레코드를찾아가는경우 튜닝방법 sequential access 에의한선택비중증가 random access 발생량감소
27 / 166 SQL TUNING OPTIMIZER 최적화과정 조건절분류 ACCESS 방법결정 JOIN 순서결정 JOIN 방법결정 GROUP / AGGREGATE 연산수행방법결정 DISTINCT 절수행방법결정 SET 절수행방법결정 ORDER BY 절수행방법결정 PROJECTION 수행방법결정
28 / 166 SQL TUNING SQL 튜닝절차 오래수행되는 SQL 확인 explain plan 설정 set timing on 설정 실행계획확인 SQL 변경 or 인덱스설정 or 힌트등을사용하여 SQL 튜닝 SQL 튜닝방법 가능한한번만 PREPARE 효율적인인덱스사용여부확인 Driving 테이블의적합성확인 인덱스가필요하면추가 HINT 활용 부분범위처리권고 (limit 등활용 )
SQL TUNING SQL 튜닝한계 Modeling 단계에서성능및튜닝에대한부분이고려되지않으면 SQL 튜닝만으로성능향상기대어려움 매우큰데이터집합이리턴되거나, 거대한볼륨전체를핸들링하는업무같은경우성능향상어려움 다음의경우아키텍쳐기반튜닝필요 디스크 I/O 분산 잘못된데이터베이스스키마변경 데이터베이스 CALL 횟수최소화 네트워크부하분산 SQL PLAN CACHE 활용 29 / 166
30 / 166 DBMS TUNING SQL PLAN
SQL PLAN 실행계획이란? SQL이실행될때필요한처리절차. Optimizer에의해생성 실행계획확인 EXPLAIN PLAN 설정 ALTER SESSION SET EXPLAIN PLAN = {ON ONLY OFF} - ON : 실행계획 + 수행결과 - ONLY : 실행계획만 - OFF : 수행결과만 예 isql> ALTER SESSION SET EXPLAIN PLAN = ON; isql> SELECT eno, ename, salary FROM employee WHERE eno=1; ENO ENAME SALARY -------------------------------------------------- 1 EJJUNG 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 35 ) SCAN ( TABLE: EMPLOYEE, INDEX: SYS_IDX_ID_163, ACCESS: 1, SELF_ID: 2 ) ------------------------------------------------------------ 31 / 166
32 / 166 SQL PLAN 실행계획용어 PLAN 을읽는방법은가장안쪽부터, 위에서아래의순서로읽음 PLAN 용어설명 isql> SELECT /*+ USE_NL(T1, T2 ) */ T1.i1 FROM t1, t2 WHERE t1.i1=t2.i1; I1 -------------- No rows selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) ------------------- (4) JOIN (REF_ID:2) ---------------------------------------------------------------- (3) SCAN ( TABLE: T1, FULL SCAN, ACCESS: 2, SELF_ID: 1 ) ----- (1) SCAN ( TABLE: T2, INDEX: T2_I1, ACCESS: 0, SELF_ID: 2 ) ------ (2) [ VARIABLE KEY ] OR AND T1.I1 = T2.I1 COLUMN_COUNT = PROJECTION(select ) 되는 column 수 TUPLE_SIZE = COLUMN size 의합 ACCESS : [n] = 테이블에서 SCAN 한 RID (ROWID) 의건수를의미 PLAN NODE = SCAN, HASH, SORT, PROJ SELF_ID : plan tree 로구성됐을때의노드 ID VARIABLE KEY : key range 하는술어 SELF_ID : plan tree 로구성됐을때의노드 ID
33 / 166 SQL PLAN PREDICATE 를자세히보고자할경우 System level 의 property 설정 ALTER SYSTEM SET TRCLOG_DETAIL_PREDICATE=1 예제 isql> ALTER SYSTEM SET TRCLOG_DETAIL_PREDICATE=1; Alter success. isql> ALTER SESSION SET EXPLAIN PLAN = ON; Alter success. isql> SELECT e.ename, d.dname 2 FROM employee e, department d 3 WHERE e.dno = d.dno 4 AND e.ename='kskim'; ENAME DNAME --------------------------------------------------------- KSKIM CUSTOMER SUPPORT DEPT 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 2, TUPLE_SIZE: 54 ) JOIN SCAN ( TABLE: EMPLOYEE E, FULL SCAN, ACCESS: 20, SELF_ID: 2 ) [ FILTER ] predicate 정보 E.ENAME = 'KSKIM' SCAN ( TABLE: DEPARTMENT D, INDEX: SYS_IDX_ID_322, ACCESS: 1, SELF_ID: 3 ) [ VARIABLE KEY ] predicate 정보 OR AND E.DNO = D.DNO ------------------------------------------------------------
34 / 166 SQL PLAN WHERE 절에서조건절처리유형 Index : T1(i1, i2, i3) SQL : SELECT * FROM T1 WHERE? = 1 AND i1 > 1 AND i2 = 2 AND i4 = 'abc' AND EXISTS ( SELECT * FROM T2 WHERE T2.a1 = T1.i3 ) ; 분류 처리순서 설명 example Key Range 2 인덱스를사용하여범위검색이가능한조건 T1.i1 > 1 Key Filter 3 범위검색은안되나인덱스의키값을비교하여검사가가능한조건 T1.i2 = 1 Constant Filter 1 테이블의데이터와관계없이한번의검사만으로판단이가능한조건? = 1 Filter 4 데이터에대한직접적인비교가필요한조건 T1.i4 = abc Subquery Filter 5 Subquery를포함하고있는조건 EXISTS ()
35 / 166 SQL PLAN 인덱스가있더라도사용할수없는조건절 인덱스를사용할수없는연산자 WHERE enname LIKE '_K%'; WHERE enname NOT LIKE 'KIM%'; 인덱스칼럼에포함되었더라도변형을한경우 WHERE TO_CHAR(c1) = a ; WHERE SUBSTR(ename,1,4) = 'alti'; WHERE salary * 12 < 30000000; 데이터타입이다른경우 ( 일부의데이터타입 ) WHERE start_flag = 1; (start_flag 의타입이 CHAR/VARCHAR 인경우 ) 결합인덱스일경우첫번째컬럼의인덱스를탈수있는조건이없는경우 WHERE c2 = a ; (c1, c2 순서로결합인덱스를생성한경우 ) ALTIBASE Optimizer 가 Index SCAN COST 가더소요된다고판단하였을때
36 / 166 SQL PLAN 비교연산자에따른인덱스사용여부 분류 비교연산자 가능여부 비고 = O!= O 단순비교 < O <= O > O >= O 범위비교 BETWEEN NOT BETWEEN O O 멤버비교 IN NOT IN O O 패턴비교 LIKE O 가능 : T1.i1 LIKE 'abc%' 불가 : T1.i1 LIKE '%abc' NOT LIKE X
37 / 166 SQL PLAN 분류비교연산자가능여부비고 NULL 비교존재비교 Quantify ANY Quantify ALL IS NULL O IS NOT NULL O EXISTS X NOT EXISTS X =ANY O!=ANY O <ANY O <=ANY O >ANY O >=ANY O =ALL O!= ALL O < ALL O <= ALL O > ALL O >= ALL O
38 / 166 CHAR VARCHAR SMALLINT INTEGER BIGINT NUMERIC FLOAT REAL DOUBLE DATE BLOB NIBBLE BYTE GEOMETRY SQL PLAN 인덱스컬럼과 VALUE 의데이터타입간호환여부 인덱스가있어도데이터타입이호환되지않으면인덱스사용불가 VALUE KEY CHAR O O X X X X X X X X - - - - VARCHAR O O X X X X X X X X - - - - SMALLINT X X O O O O O O O - - - - - INTEGER X X O O O O O O O - - - - - BIGINT X X O O O O O O O - - - - - NUMERIC O O O O O O O O O - - - - - FLOAT O O O O O O O O O - - - - - REAL X X O O O O O O O - - - - - DOUBLE O O O O O O O O O - - - - - DATE O O - - - - - - - O - - - - BLOB - - - - - - - - - - O - - - NIBBLE - - - - - - - - - - - O - - BYTE - - - - - - - - - - - - O - GEOMETRY - - - - - - - - - - - - - O
39 / 166 SQL PLAN ALTIBASE 에서지원하는조인방법 Nested loops 조인계열 Sort-based 조인계열 Hash-based 조인계열
SQL PLAN NESTED LOOPS 조인수행방법 선행테이블에서조건에만족하는레코드검색 선행테이블의조인키값으로후행테이블조인수행 선행테이블조건에만족하는모든레코드에대해 1,2 번반복 NESTED LOOPS 조인용어 Driving 테이블, Outer 테이블 먼저 Scan 하는선행테이블 Lookup 테이블, Inner 테이블 선행테이블에서조인조건에만족하는레코드와연결하는후행테이블 Random access 로찾아감 조인컬럼에인덱스가있어야효율적 NESTED LOOPS 조인특성 Random access 위주조인방식 선행테이블조건에만족하는하나의레코드씩순차적진행 OLTP 시스템에서일차적으로고려 부분범위처리시유용 40 / 166
41 / 166 SQL PLAN NESTED LOOPS 조인 중첩루프와동일한방식으로동작 isql> SELECT * FROM employees e, departments d 2 WHERE e.dno = d.dno 3 AND e.emp_job = 'manager' 4 AND e.salary > 2000000; emp_job_idx employees 1 5. enginner enginner enginner manager manager manager manager manager sales 2 6 (O) (O) (X) (O) 7 3 dept_dno_pk 10 20 30 40 50 60 8 4 departments slaes sales (X)
42 / 166 SQL PLAN SORT MERGE 조인수행방법 outer 테이블조건에만족하는레코드를조인컬럼값으로정렬 inner 테이블조건에만족하는레코드를조인컬럼값으로정렬 outer 테이블조인컬럼값과같은레코드를 inner 테이블에서탐색하고, 다른값이나오는순간조인중지 outer 테이블다음레코드의조인컬럼값과같은레코드를 inner 테이블에서탐색하며나오는순간조인중지 SORT MERGE 조인특징 양쪽테이블에정렬이수행된후조인을수행 인덱스를통해미리정렬이되어있을경우는조인을수행하지않음 Non equi 조인일경우 Sort Merge 조인으로수행
43 / 166 SQL PLAN SORT MERGE 조인 Sort 단계 : 양쪽집합을조인컬럼으로정렬 Merge 단계 : 정렬된양쪽집합을병합 isql> SELECT * FROM employees e, departments d 2 WHERE e.dno = d.dno 3 AND e.emp_job = 'manager' 4 AND d.loc='seoul'; departments employees 1 Seoul 인데이터만 dno 값으로정렬 dno dname loc 20 Sales Seoul 40 Tech Seoul 50 Marketing Seoul 3 eno ename emp_job dno 2 Kim manager 10 13 Lee manager 20 17 Park manager 20 2 manager 인데이터만 dno 값으로정렬 X 5 Hong manager 40 9 Yun manager 40
44 / 166 SQL PLAN HASH-BASED 조인수행방법 선행테이블 (Build) 조건에맞는레코드의조인컬럼에 Hash function 수행한결과로 Hash map 생성 후행테이블 (Probe) 조건에맞는레코드의조인컬럼에 Hash function 수행한후 Hash map 을탐색하며조인수행 HASH-BASED 조인특징 NL 조인의 Random access와 SM 조인의정렬부담이없음 Hash function 수행및 Hash map 생성비용 조인컬럼에인덱스가없을경우수행 Equi join 에서만사용 일반적으로대용량의테이블조인시사용 Build 테이블이작아야효과적 (Hash map이디스크에생성될경우디스크 I/O 발생 )
SQL PLAN HASH-BASED 조인 작은테이블 (Build) 을먼저읽어 Hash map 을생성하고큰테이블 (Probe) 을읽어 Hash map 을탐색하면서조인 isql> SELECT * FROM employees e, departments d 2 WHERE e.dno = d.dno 3 AND e.emp_job = 'manager' 4 AND d.loc='seoul'; 1 departments Hash map employees Seoul 인데이터만 Search dno dname loc 20 Sales Seoul 40 Tech Seoul 50 Marketing Seoul 3 ƒ(dno) ƒ(dno) eno ename emp_job dno 2 Kim manager 10 5 Hong manager 40 9 Yun manager 40 13 Lee manager 20 2 manager 인데이터만 Search Hash function 을수행하여 hash map 생성 4 Hash function을수행하여 hash map 에서같은데이터가있는지탐색 17 Park manager 20 45 / 166
46 / 166 DBMS TUNING SQL HINT
47 / 166 SQL HINT HINT 개념 옵티마이저가올바른실행계획을생성할수있도록유도 HINT 를사용하는 SQL SELECT UPDATE DELTE MOVE INSERT(APPEND 힌트만사용가능 ) HINT 를사용하는방법 SELECT /*+ hint */ ~ UPDATE /*+ hint */ ~ DELETE /*+ hint */ ~ MOVE /*+ hint */ ~ INSERT /*+ hint */ ~
48 / 166 SQL HINT HINT 종류 힌트 PUSH_PRED( view_name ) NO_MERGE( view ) COST RULE ORDERED TEMP_TBS_MEMORY TEMP_TBS_DISK APPEND NO_PLAN_CACHE KEEP_PLAN 설명 외부의 WHERE 절의조건중뷰와관계된조인조건을뷰내부로이동하여처리 뷰가 main query 와 merge 되는것을막을때사용 비용을고려한실행계획생성 비용을배제한실행계획생성 FROM 절에나열된순서대로조인순서를결정 SQL 처리중에생성되는모든중간결과를저장하기위해메모리임시테이블을사용 SQL 처리중에생성되는모든중간결과를저장하기위해디스크임시테이블을사용 Direct-Path INSERT 가수행 생성된플랜을플랜캐시에저장하지않음 한번생성된플랜이참조하는테이블의통계정보가변경되더라도플랜이재생성되는것을방지하고그대로사용하도록함
49 / 166 SQL HINT HINT 종류 FULL SCAN ( table ) 힌트 INDEX ASC ( table, index, index,... ), INDEX ASC ( table index index... ) INDEX DESC ( table, index, index,... ), INDEX DESC ( table index index... ) INDEX ( table, index, index,... ), INDEX ( table index index... ) NO INDEX ( table, index, index,... ), NO INDEX ( table index index... ) USE_NL ( table, table ) USE_HASH ( table, table ) USE_SORT ( table, table ) USE_MERGE ( table, table ) NO_PUSH_SELECT_VIEW ( table ) 설명 테이블에이용가능한인덱스가존재하더라도인덱스를사용하지않고테이블전체를스캔 명시된인덱스를사용하여해당테이블에대해서인덱스스캔을수행, 오름차순으로탐색 명시된인덱스를사용하여해당테이블에대해서인덱스스캔을수행, 내림차순으로탐색 명시된인덱스를사용하여해당테이블에대해서인덱스스캔을수행 명시된인덱스를사용해서해당테이블에대한인덱스스캔을수행하지않도록 Nested loops 조인계열의조인방법을사용 Hash-based 조인계열의조인방법을사용 Sort-based 조인계열의조인방법을사용 Merge 조인조인계열의조인방법을사용 외부의 WHERE 절의조건을뷰내부로이동하여처리하지않음 PUSH_SELECT_VIEW ( table ) 외부의 WHERE 절의조건중가능한것은모두뷰내부로이동하여처리
50 / 166 SQL HINT FULL SCAN(TABLE) 이용가능한인덱스가있더라도테이블데이터를전체스캔하여검색 isql> SELECT /*+ FULL SCAN(tb02 ) */ DISTINCT col1 FROM tb02 2 WHERE col3 ='testing' 3 AND col1 NOT IN (1,2,3); COL1 -------------- 4 5 6 7 8 9 0 7 rows selected. ------------------------------------------------------------ PROJECT (COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) DISTINCT (ITEM_SIZE:16, ITEM_COUNT:7, DISK_PAGE_COUNT:3, ACCESS:7, SELF_ID:3, REF_ID: 2 ) SCAN (TABLE: TB02, FULL SCAN, ACCESS: 1000000, DISK_PAGE_COUNT: 14272, SELF_ID: 2 ) [ FILTER ] AND COL3 = 'testing' COL1 <>ALL (1, 2, 3) ------------------------------------------------------------ 디스크테이블에대해서는거의대부분의 row 를찾는 SQL 에대해서는 full table scan 이 multi block IO 를실행하므로성능이빠를수있음
51 / 166 SQL HINT INDEX ASC 구문 INDEX ASC(TABLE, INDEX, INDEX, ) INDEX ASC(TABLE INDEX INDEX ) INDEX(TABLE, INDEX, INDEX, ) INDEX(TABLE INDEX INDEX ) 지정된인덱스를생성된순서대로검색 isql> SELECT /*+ INDEX ASC(tb01 tb01_idx01) */ col2 FROM tb01 2 WHERE col1=1 3 LIMIT 1; COL2 -------------- 1 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) SCAN ( TABLE: TB01, INDEX: TB01_IDX01, ACCESS: 1, SELF_ID: 2 ) [ FIXED KEY ] AND OR COL1 = 1 ------------------------------------------------------------ 인덱스의두번째칼럼의 min max 값을인덱스를이용해찾을때첫번째조건에해당하는모든값들에대해 min max 를계산하므로, index asc 힌트와 limit 1 절을이용하면한개의레코드만찾을수있어성능향상기대
52 / 166 SQL HINT INDEX DESC 구문 INDEX DESC(TABLE, INDEX, INDEX, ) INDEX DESC(TABLE INDEX INDEX ) 지정된인덱스를역순으로검색 isql> SELECT /*+ INDEX DESC(tb01 tb01_idx01) */ col2 FROM tb01 2 WHERE col1=1 3 LIMIT 1; COL2 -------------- 999991 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) SCAN ( TABLE: TB01, INDEX: TB01_IDX01, ACCESS: 1, SELF_ID: 2 ) [ FIXED KEY ] AND OR COL1 = 1 ------------------------------------------------------------ 인덱스의두번째칼럼의 min max 값을인덱스를이용해찾을때첫번째조건에해당하는모든값들에대해 min max 를계산하므로, index desc 힌트와 limit 1 절을이용하면필요한한개의레코드만찾을수있으므로성능향상기대
53 / 166 SQL HINT NO INDEX 구문 NO INDEX(TABLE, INDEX, INDEX, ) NO INDEX(TABLE INDEX INDEX ) 지정된인덱스를사용하지않음 isql> SELECT /*+ NO INDEX(tb01 tb01_idx02) */ DISTINCT col3 FROM tb01 2 WHERE col1=1 3 AND col3 = 'testing'; COL3 ------------------------------------------------------ testing 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 52 ) DISTINCT ( ITEM_SIZE:24, ITEM_COUNT:1, BUCKET_COUNT:1024, ACCESS:1, SELF_ID:3, REF_ID:2 ) SCAN ( TABLE: TB01, INDEX: TB01_IDX01, ACCESS: 100000, SELF_ID: 2 ) [ FIXED KEY ] AND OR COL1 = 1 [ FILTER ] COL3 = 'testing' ------------------------------------------------------------
54 / 166 SQL HINT USE_NL(TABLE, TABLE) Nested loops 조인계열의조인방법을사용 첫번째테이블을먼저스캔 isql> SELECT /*+ USE_NL(b, a) */ a.col1 FROM tb01 a, tb02 b 2 WHERE a.col2 = b.col2 3 AND a.col1 = b.col1 4 AND a.col3 ='testing' 5 AND b.col3 LIKE 'some%'; COL1 -------------- No rows selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) JOIN SCAN ( TABLE: TB02 B, INDEX:TB02_IDX02, ACCESS: 200, DISK_PAGE_COUNT: 14272, SELF_ID: 3 ) [ FIXED KEY ] AND OR B.COL3 LIKE 'some%' SCAN ( TABLE: TB01 A, INDEX: TB01_IDX01, ACCESS: 200, SELF_ID: 2 ) [ VARIABLE KEY ] OR AND A.COL1 = B.COL1 A.COL2 = B.COL2 [ FILTER ] A.COL3 = 'testing' ------------------------------------------------------------
55 / 166 SQL HINT USE_HASH(TABLE, TABLE) Hash-based 조인방법을사용 HASH 노드의테이블을먼저스캔 isql> SELECT /*+ USE_HASH(b, a) */ a.col1 FROM tb01 a, tb02 b 2 WHERE a.col2 = b.col2 3 AND a.col1 = b.col1 4 AND a.col3 ='testing' AND b.col3 LIKE 'some%'; COL1 -------------- No rows selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) JOIN SCAN (TABLE: TB02 B, INDEX:TB02_IDX02, ACCESS:200, DISK_PAGE_COUNT:14272, SELF_ID:3 ) [ FIXED KEY ] AND OR B.COL3 LIKE 'some%' HASH (ITEM_SIZE:24, ITEM_COUNT:999800, BUCKET_COUNT:1024, ACCESS:0, SELF_ID:4, REF_ID:2) [ FILTER ] AND A.COL1 = B.COL1 A.COL2 = B.COL2 SCAN ( TABLE: TB01 A, INDEX: TB01_IDX02, ACCESS: 999800, SELF_ID: 2 ) [ FIXED KEY ] AND OR A.COL3 = 'testing' ------------------------------------------------------------
56 / 166 SQL HINT USE_MERGE(TABLE, TABLE) Sort Merge 조인방법을사용 SORT 노드의테이블을먼저스캔 isql> SELECT /*+ USE_MERGE(b, a) */ DISTINCT a.col1 FROM tb01 a, tb02 b 2 WHERE a.col2 > b.col2 AND a.col3 LIKE 'some AND b.col3 LIKE 'some%' 3 AND b.col1=a.col1 AND b.col1=1; col1 -------------- 1 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 1, TUPLE_SIZE: 4 ) DISTINCT(ITEM_SIZE:16, ITEM_COUNT:1, DISK_PAGE_COUNT 3, ACCESS: 1, SELF_ID:6, REF_ID:2) MERGE-JOIN [ VARIABLE KEY ] B.COL1 = A.COL1 [ FILTER ] A.COL2 > B.COL2 SCAN (TABLE:TB02 B, INDEX:TB02_IDX01, ACCESS:100000, DISK_PAGE_COUNT:14272, SELF_ID:3) [ FIXED KEY ] AND OR B.COL1 = 1 [ FILTER ] B.COL3 LIKE 'some%' SORT ( ITEM_SIZE: 16, ITEM_COUNT: 200, ACCESS: 40000, SELF_ID: 4, REF_ID: 2 ) SCAN ( TABLE: TB01 A, INDEX: TB01_IDX02, ACCESS: 200, SELF_ID: 2 ) [ FIXED KEY ] AND OR A.COL3 LIKE 'some%' ------------------------------------------------------------
57 / 166 SQL HINT TEMP_TBS_MEMORY SQL 처리중생성되는모든중간결과를메모리임시테이블에저장 사용시메모리증가가능 isql> SELECT * FROM tb01 ORDER BY col2; ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 4, TUPLE_SIZE: 64 ) SORT (ITEM_SIZE:72, ITEM_COUNT:10000, DISK_PAGE_COUNT:920, ACCESS:10000, SELF_ID:2, REF_ID:1) SCAN ( TABLE: TB01, FULL SCAN, ACCESS: 10000, DISK_PAGE_COUNT: 14272, SELF_ID: 1 ) ------------------------------------------------------------ isql> SELECT /*+ TEMP_TBS_MEMORY */ * FROM tb01 ORDER BY col2; ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 4, TUPLE_SIZE: 64 ) SORT ( ITEM_SIZE: 24, ITEM_COUNT: 10000, ACCESS: 10000, SELF_ID: 2, REF_ID: 1 ) SCAN ( TABLE: TB01, FULL SCAN, ACCESS: 10000, DISK_PAGE_COUNT: 14272, SELF_ID: 1 ) ------------------------------------------------------------
58 / 166 DBMS TUNING ALTIBASE SERVER TUNING
59 / 166 ALTIBASE SERVER TUNING 로그파일생성을위한 TRANSACTION 대기 prepare 된 logfile 을전부사용후신규 logfile 을추가생성할때까지 TRANSACTION 대기로인한성능저하및 CPU 사용량증가 V$LFG 의 lf_prepare_wait_count 값확인 isql> SELECT lf_prepare_wait_count FROM V$LFG; lf_prepare_wait_count 는 ALTIBASE 구동중 logfile 이미처생성되지않아 TRANSACTION 이대기했던누적횟수를나타냄 디스크속도체크 Shell> time dd if=/dev/zero of=/altibase/altibase_home/logs/alti_test_file bs=8k count=1280 1280+0 records in 1280+0 records out real 0m0.032s user 0m0.000s sys 0m0.033s 조치사항 PREPARE_LOG_FILE_COUNT 프로퍼티값조절 PREPARE_LOG_FILE_COUNT 은 logfile manager 쓰레드가지정한값만큼미리 logfile 생성 PREPARE_LOG_FILE_COUNT 값이클수록메모리증가
ALTIBASE SERVER TUNING 체크포인트발생시디스크 I/O 에대한부하로성능저하 altibase_sm.log 파일을통해체크포인트진행과정확인 체크포인트시작 [CHECKPOINT-BEGIN] 체크포인트시작 LSN 기록 [CHECKPOINT-step2] Write BeginChkpt Log [0,89,6929497] Active Tx Recovery LSN [0,3,3874568] : Disk Buffer Oldest LSN [0,3,3874568] : dirty page 대상지정및 TRANSACTION 로그의 sync, dirty page sync [CHECKPOINT-step3] Flush Dirty Page(s) [PRE-DirtyPageCount=0] [NEW-DirtyPageCount=33036] [DUP-DirtyPageCount=0] Begin Sync For All-LFG - Request LSN [0,3,3875009] Begin Bulk DB Sync (Prop.3200) [FLU-DirtyPageCount=33036] [REM-DirtyPageCount=0] PRE-DirtyPageCount: 이전에썼던 Dirty Page 수 NEW-DirtyPageCount: 새로추가된 Dirty Page 수 DUP-DirtyPageCount: New-DirtyPage 중에서 PRE-DirtyPage 와중복되는 DirtyPage 의수 Begin Sync For All-LFG - Request LSN: TRANSACTION 로그를 Sync Begin Bulk DB Sync: dirty page sync FLU-DirtyPageCount: Flush 한 Dirty Page 수 REM-DirtyPageCount: 2 벌의데이터파일에모두기록되어 Dirty Page List 에서제거된 Page 의수 60 / 166
ALTIBASE SERVER TUNING 체크포인트발생시디스크 I/O 에대한부하로성능저하 altibase_sm.log 파일을통해체크포인트진행과정확인 datafile sync [CHECKPOINT-step4] sync Database File 체크포인트종료 LSN 기록 [CHECKPOINT-step5] Write End_Chkpt Log [0,3,3974818] 체크포인트종료에대한 TRANSACTION 로그 sync [CHECKPOINT-step6] Sync Log File Begin Sync For All-LFG - Request LSN [0,89,6885511] 이중화로보낼 TRANSACTION 로그의 SN 확인 [CHECKPOINT-step7] Check LogFiles That Is Not Needed Replication MinSN368769 loganchor 에체크포인트수행정보기록 [CHECKPOINT-step8] Update and Flush Log Anchor 불필요한 logfile 삭제 [CHECKPOINT-step8] Update and Flush Log Anchor 61 / 166
62 / 166 ALTIBASE SERVER TUNING 체크포인트발생시디스크 I/O 에대한부하로성능저하 체크포인트로그 sample(altibase_sm.log) [2011/10/05 13:51:01] [Thread-182894216896] [Level-9] [CHECKPOINT BY SYSTEM] [2011/10/05 13:51:01] [Thread-182894216896] [Level-9] [CHECKPOINT-BEGIN]... 중략 [2011/10/05 13:51:01] [Thread-182894216896] [Level-9] [CHECKPOINT-summary] BeginChkptLSN=[0,153,3043510], EndChkptLSN=[0,153,3043951], DiskRecLSN=[0,153,3043510] [2011/10/05 13:51:01] [Thread-182894216896] [Level-9] Minimum LSN = [0,153,3043510] [2011/10/05 13:51:01] [Thread-182894216896] [Level-9] [CHECKPOINT-END] 체크포인트가수행중에 [CHECKPOINT-step3] Flush Dirty Page(s) 혹은 [CHECKPO INT-step4] sync Database File 가오래수행중이라면디스크 I/O 를모니터링
63 / 166 ALTIBASE SERVER TUNING 디스크 I/O sar, iostat 을통해디스크 I/O 병목확인 Shell> sar 1 3 02:32:26 PM CPU %user %nice %system %iowait %idle 02:32:30 PM all 0.25 0.00 2.87 1.87 95.01 02:32:31 PM all 0.12 0.00 6.24 6.99 86.64 02:32:32 PM all 0.25 0.00 8.61 3.75 87.39 Shell> iostat 1 avg-cpu: %user %nice %sys %iowait %idle 0.13 0.00 8.76 3.88 87.23 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sdb1 2821.78 63.37 608388.12 64 614472
64 / 166 ALTIBASE SERVER TUNING 조치사항 logfile 과 datafile 의디스크분리 체크포인트관련프로퍼티조절 CHECKPOINT_BULK_WRITE_PAGE_COUNT CHECKPOINT_BULK_WRITE_SLEEP_SEC CHECKPOINT_BULK_WRITE_SLEEP_USEC CHECKPOINT_BULK_SYNC_PAGE_COUNT checkpoint 시 dirty page 를여러번나누어서디스크에저장할수있는데이때한번에디스크에기록하는 page 수 checkpoint 시에한번디스크에기록한후 sleep 하는시간 ( 두값이합산된시간을 sleep) checkpoint 시에메모리와디스크의데이터를일치시킬 page 단위 기본값보다프로퍼티의값을줄여주면디스크 I/O 분산효과가있지만 logfile 이증가할수있음 위의사항을적용했음에도불구하고성능향상이없다면, 디스크성능한계치에도달한것으로예측
65 / 166 ALTIBASE SERVER TUNING 디스크테이블에대한 BUFFER HIT 율저하로디스크 I/O 증가 디스크테이블페이지를적재할때한정된크기의 buffer pool 을사용하므로버퍼교체가이루어지고, 버퍼교체가일어나면디스크 I/O 로인해성능저하 버퍼관련성능뷰를조회하여버퍼상황확인 isql> SELECT hit_ratio 'HIT_RATIO(%)', victim_search_warp FROM V$BUFFPOOL_STAT; HIT_RATIO(%) VICTIM_SEARCH_WARP ----------------------------------------------- 99.8061076102763 0 VICTIM_SEARCH_WARP 값이증가하고있다면, flusher 가밀리고있음 디스크테이블관련 SQL 중대량의페이지를 access 하는쿼리튜닝 BUFFER_AREA_SIZE 프로퍼티변경
66 / 166 ALTIBASE SERVER TUNING 모든 SERVICE THREAD 가 BUSY 하면새로운 SERVICE THREAD 생성으로시스템부하증가 V$SERVICE_THREAD 를통해 service thread 관련부하확인 isql> SELECT RPAD(type, 30), count(*) FROM V$SERVICE_THREAD GROUP BY type 2 UNION ALL 3 SELECT RPAD(name, 30), value1 FROM V$PROPERTY 4 WHERE name LIKE 'MULTIPLEXING%_THREAD_COUNT'; RPAD(TYPE, 30) COUNT ----------------------------------------------- SOCKET 44 IPC 10 MULTIPLEXING_THREAD_COUNT 8 MULTIPLEXING_MAX_THREAD_COUNT 1024 SOCKET 항목의수치가 MULTIPLEXING_THREAD_COUNT 항목의수치보다클경우 오래수행되는 SQL 튜닝 MULTIPLEXING_THREAD_COUNT 프로퍼티변경
67 / 166 ALTIBASE SERVER TUNING 메모리 AGER 의 AGING 으로인한성능저하 메모리테이블의 MVCC 기법으로인해생성되는 old versioning 정보를메모리 ager가삭제 메모리 ager 종류 MEM_LOGICAL_AGER MEM_DELTHR 인덱스페이지에대한 versioning 정보삭제 데이터페이지에대한 versioning 정보삭제 메모리 ager 가밀린다면? versioning 증가에의한메모리증가 SQL 처리시 versioning 정보들을참조해야하기때문에성능저하 V$MEMGC 를통해메모리 ager 수행여부확인 메모리 ager 관련프로퍼티 AGER_WAIT_MINIMUM ager 가해야할 Job 이없을경우대기하는최소시간 AGER_WAIT_MAXIMUN ager 가해야할 Job 이없을경우대기하는최대시간 ager 는작업이없으면 MAX 만큼쉬고, 일이있으면 MAX 부터 1/2 씩쉬는시간을줄여 MIN 까지점차적으로쉬는시간을줄여감. 일이없으면다시 MAX 까지쉬는시간을늘려감
68 / 166 ALTIBASE SERVER TUNING 확인사항 gc gap 조회 isql> SELECT gc_name, add_oid_cnt, gc_oid_cnt, add_oid_cnt - gc_oid_cnt gcgap FROM V$MEMGC; ADD_OID_CNT GC_OID_CNT GCGAP ------------------------------------------------------------------- 113 113 0 113 113 0 gc gap 이클수록 ager 가삭제해야할 old version 의양이많다는의미 Ager 가대기하는 TRANSACTION 정보 isql> SELECT session_id, total_time, execute_time, tx_id, query 2 FROM V$STATEMENT 3 WHERE tx_id IN (SELECT id 4 FROM V$TRANSACTION 5 WHERE memory_view_scn = (SELECT minmemscnintxs FROM V$MEMGC LIMIT 1)) 6 AND execute_flag = 1 7 ORDER BY 2 DESC; 조치사항 GC 대상 TRANSACTION 에서수행하는 SQL 튜닝 AGER_WAIT_MINIMUM, AGER_WAIT_MAXIMUM 값을줄여 ager 가수행빈도증가
69 / 166 ALTIBASE SERVER TUNING SUMMARY 성능향상을위해 ALTIBASE 관점에서확인해야하는사항 logfile을 write하는동안대기하는가? 체크포인트시디스크 I/O에대한병목이큰가? buffer의 hit율은좋은가? 메모리 ager가잘수행되는가?
70 / 166 DBMS TUNING TRANSACTION TUNING
71 / 166 TRANSACTION TUNING 빈번한 PREPARE 수행 Prepare-Validation-Optimization(PVO) 과정이단순 DML 일경우전제 SQL 처리과정의 60~70% 비중차지 V$SYSSTAT 에서 execute 대비 prepare 수치조회 isql> SELECT TO_CHAR(SYSDATE,'HH:MI:SS'), name, value FROM V$SYSSTAT 2 WHERE name IN ('execute success count','prepare success count'); TO_CHAR(SYSDATE,'HH:MI:SS') NAME VALUE ------------------------------------------------------------------------ 11:35:47 execute success count 1225664 11:35:47 prepare success count 234218 isql> / TO_CHAR(SYSDATE,'HH:MI:SS') NAME VALUE ------------------------------------------------------------------------ 11:36:47 execute success count 1272912 11:36:47 prepare success count 273319 47248(1272912-1225664) 문장실행시 39101(273319-234218) PREPARE 를실행 ( 약 83%) prepare 비중이많다면바인딩변수사용구조로변경권고
72 / 166 TRANSACTION TUNING 오래수행되는 SQL(LONG TERM QUERY) SQL 처리하는동안해당서비스쓰레드가 CPU 1 장 (100%) 을사용 CPU 부하의가장많은원인 V$STATEMENT 를통해오래수행되는 SQL 조회 V$STATEMENT 의 query 는 16K 까지만보여주므로전체 query 를조회하기위해서는 V$SQLTEXT 로확인
73 / 166 TRANSACTION TUNING V$SQLTEXT 전체 SQL 확인할때조회하는성능뷰 칼럼 설명 SID STMT_ID PIECE TEXT session ID statement ID SQL 조각순서 (64byte 단위로나누어저장되어있음 ) 실제 SQL 내용 V$STATEMENT 의 session_id, id 칼럼과 sid, stmt_id 의칼럼이각각같다는조건을이용하여구문작성 isql> SELECT text FROM V$SQLTEXT 2 WHERE (sid,stmt_id) IN (SELECT session_id, id FROM V$STATEMENT WHERE id = 1123) 3 ORDER BY piece;
74 / 166 TRANSACTION TUNING V$STATEMENT 에서 QUERY 와 TIME 정보확인 isql> ALTER SYSTEM SET TIMED_STATISTICS=1; isql> SET VERTICAL ON; isql> SELECT query, execute_time, parse_time, total_time, optimize_time, validate_time, 2 execute_success, mem_cursor_full_scan, mem_cursor_index_scan, disk_cursor_full_scan, 3 disk_cursor_index_scan 4 FROM V$STATEMENT 5 ORDER BY execute_time DESC 6 LIMIT 10; QUERY : select * from employee where ename= ALTIBASE' EXECUTE_TIME : 9 PARSE_TIME : 151 TOTAL_TIME : 423 OPTIMIZE_TIME : 76 VALIDATE_TIME : 97 EXECUTE_SUCCESS : 1 MEM_CURSOR_FULL_SCAN : 1 MEM_CURSOR_INDEX_SCAN : 0 DISK_CURSOR_FULL_SCAN : 0 DISK_CURSOR_INDEX_SCAN : 0 full table scan SQL 로대부분의시간이 prepare 하는데소요
TRANSACTION TUNING 오래수행되는 SQL 튜닝 실행계획을확인하여 access 방식, join 방식, join 순서등을파악하여튜닝 메모리테이블은 table full scan 보다는 index scan이더유리 실행계획확인방법 EXPLAIN PLAN 설정 ON : 실행결과 + 실행계획 ONLY : 실행계획만 OFF : 실행결과만 isql> ALTER SESSION SET EXPLAIN PLAN = ON; isql> SELECT eno, ename, salary FROM employee WHERE eno=1; ENO ENAME SALARY -------------------------------------------------- 1 EJJUNG 1 row selected. ------------------------------------------------------------ PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 35 ) SCAN ( TABLE: EMPLOYEE, INDEX: SYS_IDX_ID_163, ACCESS: 1, SELF_ID: 2 ) ------------------------------------------------------------ 75 / 166
76 / 166 TRANSACTION TUNING LOCK lock 부하로인해다른 TRANSACTION에영향을주어성능저하 V$LOCK, V$LOCK_WAIT, V$TRANSACTION, V$STATEMENT 정보확인 TRANSACTION을가급적작은단위로나누어 lock 지속시간줄임 dead lock이발생할수있는상황방지
77 / 166 TRANSACTION TUNING LOCK 잡고있는 SQL 확인 isql> SELECT tx.id tx_id, lw.wait_for_trans_id blocked_tx_id, l.lock_desc, 2 DECODE(tx.first_update_time, 0, '0', to_char(to_date('1970010109','yyyymmddhh') 3 + tx.first_update_time / (60*60*24), 'MM/DD HH:MI:SS')) first_update_time, 4 DECODE(tx.status, 0, 'BEGIN', 1, 'PRECOMMIT', 2, 'COMMIT_IN_MEMORY', 3, 'COMMIT', 5 4, 'ABORT', 5, 'BLOCKED', 6, 'END') status, 6 st.query current_query 7 FROM V$TRANSACTION tx, V$LOCK l 8 LEFT OUTER JOIN V$LOCK_WAIT lw ON l.trans_id = lw.trans_id 9 LEFT OUTER JOIN (SELECT st.query,tx_id FROM V$STATEMENT st, V$SESSION ss 11 WHERE ss.id = st.session_id ) st 12 ON l.trans_id = st.tx_id 13 WHERE tx.id = l.trans_id; TX_ID : 103489 BLOCKED_TX_ID : LOCK_DESC : IX_LOCK FIRST_UPDATE_TIME : 09/02 14:42:35 STATUS : BEGIN CURRENT_QUERY : update t1 set c1=1 where c1 between 1.11 and 1.112 TX_ID : 4288 BLOCKED_TX_ID : 103489 LOCK_DESC : IX_LOCK FIRST_UPDATE_TIME : 0 STATUS : BLOCKED CURRENT_QUERY : update t1 set c1=1 where c1 =1.11
78 / 166 TRANSACTION TUNING LOCK 잡고있는세션강제종료 isql(sysdba)> ALTER DATABASE mydb SESSION CLOSE 10; mydb : 데이터베이스이름 10 : session_id 강제세션종료시세션종료될때까지시간소요 (rollback 처리등 )
79 / 166 TRANSACTION TUNING DURABILITY 설정방법 altibase.properties 파일에서관련프로퍼티변경설정 COMMIT_WRITE_WAIT_MODE, LOG_BUFFER_TYPE 프로퍼티설정 데이터베이스구동시설정된 Durability 로구동 데이터베이스운영중에실시간으로변경불가능
TRANSACTION TUNING COMMIT_WRITE_WAIT_MODE =0 OS Kernel 영역로그버퍼를사용하기때문에 ALTIBASE 프로세스가비정상종료를하더라도 TRANSACTION이 commit한로그는운영체제에의해로그파일에반영 성능지향설정방법 OS의 crash 상황만아니면 TRANSACTION durability 완벽지원 COMMIT_WRITE_WAIT_MODE = 1 로그를프로세스영역의로그버퍼에기록하고, 물리적인로그파일에기록하는것을보장하기때문에 ALTIBASE 장애시에도 durability 보장 모든로그가로그파일에반영됨을보장하기때문에어떠한시스템장애상황에서도완벽하게 TRANSACTION durability 보장 durability level 중성능이가장느림 80 / 166
TRANSACTION TUNING DURABILITY 설정방법 목적 성능위주설정 (Durability = 3) 설명및설정항목 운영체제가 TRANSACTION 로그파일의디스크 Sync 를보장하는설정운영체제의 Crash 와같은장애를제외한모든장애경우에대해 durability 보장 LOG_BUFFER_TYPE 0 COMMIT_WRITE_WAIT_MODE 0 안정성위주설정 (Durability = 5) ALTIBASE 가직접디스크 Sync 를보장하는설정물리적인디스크장애외에는어떠한장애라도 durability 보장 LOG_BUFFER_TYPE 1 COMMIT_WRITE_WAIT_MODE 1 COMMIT_WRITE_WAIT_MODE ALTER SESSION 명령어로변경가능 LOG_BUFFER_TYPE 변경하려면데이터베이스재기동필요 81 / 166
TRANSACTION TUNING SUMMARY 성능향상을위해 application 관점에서확인해야하는사항 TRANSACTION 양이많은가? connect - disconnect 를반복하는구조인가? prepare 를자주하는가? long term query 가수행되는가? lock 경합이빈번히발생하는가? update retry 가발생하는가? 통신방식은무엇을사용하는가? 82 / 166
83 / 166 DBMS TUNING DBMS STATS
84 / 166 DBMS STATS 개념 DBMS의통계자료를수집, 변경 ( 설정 ), 삭제하는기능 저장프로시저 (Stored Procedure) 형태로제공 통계자료는쿼리옵티마이저가최적화된실행계획을만들기위해사용 개별컬럼, 인덱스, 테이블또는시스템별로통계자료설정및삭제 6.1.1 버전부터제공 유의사항 통계자료수집시, SERVER 부하가중 통계자료는근사치를수집 통계자료를수집한대상객체와관련된모든쿼리의실행계획을재구축하게되어성능저하발생가능
85 / 166 DBMS STATS V$DBMS_STATS 데이터베이스전체의통계정보를보여주는성능뷰 Column name Description DATE 마지막으로통계정보를수집한일시 SAMPLE_SIZE 통계정보수집을위해선택된샘플의크기 NUM_ROW_CHANGE 마지막통계정보수집이후행개수의변경된양 TYPE 통계수집대상의유형 (S : 시스템, T : 테이블, I : 인덱스, C : 컬럼 ) SREAD_TIME 하나의페이지를읽는데소요된평균시간 MREAD_TIME 여러페이지를한번에읽는데소요된평균시간 MREAD_PAGE_COUNT 여러페이지를한번에읽을때얽어오도록설정된페이지의수 HASH_TIME 해쉬수행에소요된평균시간 COMPARE_TIME 비교수행에소요된평균시간 STORE_TIME 메모리임시테이블에저장하는데소요된평균시간 TARGET_ID 통계수집대상이된테이블의 OID 또는인덱스의 ID COLUMN_ID 통게수집대상이된컬럼의 ID NUM_ROW 통계수집대상 ( 테이블또는인덱스 ) 의행의개수 NUM_PAGE 통계수집대상 ( 테이블또는인덱스 ) 의페이지개수
86 / 166 DBMS STATS V$DBMS_STATS Column name NUM_DIST NUM_NULL AVG_LEN ONE_ROW_READ_TIME AVG_SLOT_COUNT INDEX_HEIGHT CLUSTERING_FACTOR MIN MAX META_SPACE USED_SPACE AGEABLE_SPACE FREE_SPACE Description 인덱스또는컬럼에서중복되지않은유일한값의개수컬럼에서 NULL의개수행또는컬럼의평균길이행하나를읽는데소요된평균시간 Leaf 노드당슬롯의평균개수인덱스의루트에서 leaf 노드까지의깊이인덱스에부합하게데이터가정렬되어있는정도인덱스또는컬럼의최소값인덱스또는컬럼의최대값데이터관리를위해사용된공간의크기데이터저장하기위해사용된공간의크기나중에 aging 되어재활용할수있는공간의크기테이블또는인덱스에할당된영역중에서사용가능한공간의크기 V$DBMS_STATS 성능 View 는 6.3.1 버전부터제공
87 / 166 DBMS STATS DBMS STATS 프로시저 통계자료수집및실행계획재구축 Procedure Name GATHER_SYSTEM_STATS GATHER_DATABASE_STATS GATHER_TABLE_STATS GATHER_INDEX_STATS Description 데이터베이스시스템에대한통계자료수집모든테이블에대한통계자료수집특정테이블에대한통계자료수집특정인덱스에대한통계자료수집 6.1.1 버전부터제공 Procedure 개별적인 Name 컬럼, 인덱스, 테이블또는시스템관련 Description 통계자료를변경 SET_SYSTEM_STATS 데이터베이스시스템에대한통계자료를변경 SET_TABLE_STATS 특정테이블에대한통계자료를변경 SET_INDEX_STATS 특정인덱스에대한통계자료를변경 SET_COLUMN_STATS 특정테이블의컬럼에대한통계자료를변경 6.3.1 버전부터제공
88 / 166 DBMS STATS DBMS STATS 프로시저 개별적인컬럼, 인덱스, 테이블또는시스템관련통계자료를조회 Procedure Name GET_SYSTEM_STATS GET_DATABASE_STATS GET_TABLE_STATS GET_INDEX_STATS Description 데이터베이스시스템에대한통계자료조회모든테이블에대한통계자료조회특정테이블에대한통계자료조회특정인덱스에대한통계자료조회 6.5.1 버전부터제공 Procedure 개별적인 Name 컬럼, 인덱스, 테이블또는시스템관련 Description 통계자료를삭제 DELETE_SYSTEM_STATS 데이터베이스시스템에대한통계자료를삭제 DELETE_DATABASE_STATS 모든테이블에대한통계자료를삭제 DELETE_TABLE_STATS 특정테이블에대한통계자료를삭제 DELETE_INDEX_STATS 특정인덱스에대한통계자료를삭제 DELETE_COLUMN_STATS 특정테이블의컬럼에대한통계자료를삭제 6.5.1 버전부터제공
89 / 166 ALTIBASE ADVANCE ALTIBASE OPERATION
90 / 166 ALTIBASE OPERATION CONTENTS TRACE FILE PERFORMANCE VIEW OS CHECK LIST
91 / 166 ALTIBASE OPERATION TRACE FILE
92 / 166 TRACE FILE ALTIBASE TRACE FILE $ALTIBASE_HOME/trc 에위치 C1 C2 C3 E/SQL CLI ODBC JDBC IPC UNIX DOMAIN TCP/IP altibase_boot.log Physical Memory ALTIBASE Parsing/ validation Transaction Manager Query Processor Storage Manager Memory Tables Optimizer Recovery Manager Executor Buffer Manager Buffer Replication altibase_qp.log altibase_sm.log altibase_rp.log altibase_rp_conflict.log Checkpoint image files Datafiles loganchor logfiles ALTIBASE Architecture
93 / 166 TRACE FILE TRACE FILE 종류 파일이름 주요내용 altibase_boot.log altibase_error.log altibase_rp.log ALTIBASE 가동작된상태정보구동및종료에관련된각종 step 정보구동중디스크부족으로인한에러등여러가지에러상황에대한정보 비정상종료가발생할경우 Call-Stack 정보 Replication 모듈에서발생하는경고및에러정보 altibase_rp_confilct.log altibase_sm.log altibase_qp.log 이중화상태, 이중화 conflict 등의정보 Storage Manager 모듈에서발생하는경고및에러정보체크포인트, 백업등의정보 Query Processor 모듈에서발생하는경고및에러정보 DDL 문의성공 / 실패정보 altibase_id.log 시스템레벨에서발생하는경고및에러정보 altibase_mm.log 메인모듈에서발생하는경고및에러정보
94 / 166 TRACE FILE altibase_qp.log 사용자가수행한 DDL문정보 ALTER SYSTEM 명령어로 property를변경한정보 altibase_qp.log SAMPLE 테이블스페이스 DDL [2012/10/27 13:32:48] [Thread-258] [Level-2] [EXEC_DDL_BEGIN : CREATE TABLESPACE DISK_TBS DATAFILE 'disk_tbs001.dbf' SIZE 100M AUTOEXTEND OFF] [2012/10/27 13:32:50] [Thread-258] [Level-2] [EXEC_DDL_END : SUCCESS] 테이블 DDL [2012/10/27 14:11:53] [Thread-515] [Level-2] [EXEC_DDL_BEGIN : TRUNCATE TABLE TEST12] [2012/10/27 14:11:53] [Thread-515] [Level-2] [EXEC_DDL_END : SUCCESS] Property 변경 [2012/10/31 11:36:59] [Thread-515] [Level-0] [SET-PROP] TIMED_STATISTICS=[1]
95 / 166 TRACE FILE altibase_sm.log 메모리 / 디스크체크포인트진행및수행결과 인덱스생성진행및수행결과 백업진행및수행결과 ARCHIVE thread 오류발생정보 기타디스크관련에러정보 altibase_sm.log SAMPLE( 체크포인트 ) -- CHECKPOINT 가발생한이유에대해기록 CHECKPOINT BY LOGFILE SWITCH COUNT, CHECKPOINT BY USER, CHECKPOINT BY TIME [2018/02/06 17:23:05 55E][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT BY TIME(6000 sec)] -- CHECKPOINT 시작 [2018/02/06 17:23:05 55F][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-BEGIN] -- BEGIN CHECKPOINT 기록메모리데이터베이스의 recoverylsn 정보가기록되고차후 Recovery 를할경우이정보이용 [2018/02/06 17:23:05 560][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step2] Write BeginChkpt Log [0,1413724,0]
96 / 166 TRACE FILE -- CHECKPOINT 발생시점에가장오래된 TRANSACTION 이기록한첫번쨰 BeginLog Active Tx Recovery LSN [1413724,0] -- CHECKPOINT 발생시점에버퍼에접근한가장오래된 TRANSACTION 이기록한첫번째 BeginLog Disk Buffer Oldest LSN [1413724,133152025] -- 변경된메모리데이터베이스의 DirtyPage Flush 메모리에대한 TRANSACTION 로그를디스크로쓰고, 변경된데이터페이지를 Checkpoint Image File 에저장 [2018/02/06 17:23:05 561][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step3] Flush Dirty Page(s) -- Ping-Pong CHECKPOINT 를수행하기때문에이전에내렸던 Dirty Page 개수기록 [2018/02/06 17:23:05 562][PID:16377][Thread-140449010857728][LWP-16414] [PRE-DirtyPageCount=0] -- 현재 CHECKPOINT 시점에새롭게추가된 DirtyPage 개수 [2018/02/06 17:23:05 563][PID:16377][Thread-140449010857728][LWP-16414] [NEW-DirtyPageCount=11] -- 이전 CHECKPOINT 와현재 CHECKPOINT 시점에중복되는 DirtyPage 개수 [2018/02/06 17:23:05 564][PID:16377][Thread-140449010857728][LWP-16414] [DUP-DirtyPageCount=0] -- DirtyPage 내리기전, TRANSACTION 로그를먼저디스크로 sync [2018/02/06 17:23:05 565][PID:16377][Thread-140449010857728][LWP-16414] + Begin Sync For All-LFG - Request LSN [0,1413781] [2018/02/06 17:23:05 566][PID:16377][Thread-140449010857728][LWP-16414] + End Sync For All-LFG
97 / 166 TRACE FILE -- flush 한 DirtyPage 수 [2018/02/06 17:23:05 567][PID:16377][Thread-140449010857728][LWP-16414] [FLU-DirtyPageCount=11] -- 2 벌의데이터파일에모두기록되어 DirtyPageList 에서제거된 Page 수 [2018/02/06 17:23:05 568][PID:16377][Thread-140449010857728][LWP-16414] [REM-DirtyPageCount=0] -- CHECKPOINT Image 파일들을모두 sync [2018/02/06 17:23:05 569][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step4] sync Database File -- DISK I/O 통계정보 ========================================================== SM IO STAT - Checkpoint DB SIZE : 360448 Byte ( 11 Page) LOG SIZE : 57 Byte TOTAL TIME : 0 s 1735 us LOG SYNC TIME: 0 s 290 us DB FLUSH TIME: 0 s 1445us SYNC TIME : 0 s 938 us WAIT TIME : 0 s 0 us WRITE TIME: 0 s 507 us LOG IO PERF : 226.868890148546 MB/sec DB IO PERF : 237.889273356401 MB/sec =========================================================
98 / 166 TRACE FILE -- CHECKPOINT 완료를메모리에로깅 [2018/02/06 17:23:05 56B][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step5] Write End_Chkpt Log [0,1413935,3579565754] -- CHECKPOINT 과정에서변경된페이지에접근한 TRANSACTION 이존재할수있고 CHECKPOINT 가완료된로그도디스크로 Sync 해야하기때문에다시한번메모리상의로그 Sync [2018/02/06 17:23:05 56C][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step6] Sync Log File [2018/02/06 17:23:05 56D][PID:16377][Thread-140449010857728][LWP-16414] + Begin Sync For All-LFG - Request LSN [0,1413968] [2018/02/06 17:23:05 56E][PID:16377][Thread-140449010857728][LWP-16414] + End Sync For All-LFG -- 현재는의미없는로그임으로무시 [2018/02/06 17:23:05 56F][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step7] Check LogFiles That Is Not Needed -- sender 가어떤오류가발생했을때재전송을시작해야할 SN 정보기록 [2018/02/06 17:23:05 570][PID:16377][Thread-140449010857728][LWP-16414] Replication MinLSN [4294967295,4294967295] -- RecoveryLSN 에대해디스크부분에대한 RecoveryLSN 정보를 loganchor 파일에기록 [2018/02/06 17:23:05 571][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step8] Update and Flush Log Anchor -- 메모리상의로그와 DirtyPage 들을디스크로기록했음으로더이상복구에필요하지않은로그파일삭제 [2018/02/06 17:23:05 572][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-step9] Remove Online Log File[None]
99 / 166 TRACE FILE -- 모든 CHECKPOINT Image 파일및디스크데이터파일에 RedoLSN 정보기록 [2018/02/06 17:23:05 573][PID:16377][Thread-140449010857728][LWP-16414] [CHECK DATABASE SID=0, PPID=0, FID=0] [2018/02/06 17:23:05 574][PID:16377][Thread-140449010857728][LWP-16414] LogAnchor SpaceID=0, SmVersion=100990977, DBFileHdr SpaceID=0, SmVersion=100990977, [2018/02/06 17:23:05 575][PID:16377][Thread-140449010857728][LWP-16414] RedoLSN=control[0,1413724], [0,1413724] [2018/02/06 17:23:05 576][PID:16377][Thread-140449010857728][LWP-16414] CreateLSN=control[0,540], [0,540] -- CHECKPOINT 의 Begin/End 시점의 LSN 정보기록, 디스크의 RedoLSN 정보기록 [2018/02/06 17:23:05 583][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-summary] BeginChkptLSN=[0,1413724], EndChkptLSN=[0,1413935], DiskRecLSN=[0,1413724] -- 현재 CHECKPOINT 가진행되는시점에서가장오래된 TRANSACTION 이기록한첫번째 TRANSACTION 로그의시작위치기록 [2018/02/06 17:23:05 584][PID:16377][Thread-140449010857728][LWP-16414] Minimum LSN = [0,1413724] -- CHECKPOINT 완료기록 [2018/02/06 17:23:05 585][PID:16377][Thread-140449010857728][LWP-16414] [CHECKPOINT-END] -- 다음 CHECKPOINT 시간기록 [2018/02/06 17:23:05 586][PID:16377][Thread-140449010857728][LWP-16414] Sleep checkpoint thread ( next time : 2018-2-6 19:3:5 )
100 / 166 TRACE FILE altibase_sm.log SAMPLE(ONLINE BACKUP) [2019/03/07 16:08:26 633][PID:113130][Thread-140063711504128][LWP-113136] DISK TABLESPACE SYS_TBS_DISK_DATA DATABASE /ssd/mbw/altibase_home/dbs/system001.dbf BACKUP TO /ssd/mbw/work/imsi5/system001.dbf [2019/03/07 16:08:27 634][PID:113130][Thread-140063711504128][LWP-113136] DISK TABLESPACE SYS_TBS_DISK_UNDO DATABASE /ssd/mbw/altibase_home/dbs/undo001.dbf BACKUP TO /ssd/mbw/work/imsi5/undo001.dbf [2019/03/07 16:08:27 635][PID:113130][Thread-140063711504128][LWP-113136] DISK TABLESPACE DISK_TBS DATABASE /ssd/mbw/altibase_home/dbs/disk_tbs001.dbf BACKUP TO /ssd/mbw/work/imsi5/disk_tbs001.dbf [2019/03/07 16:08:27 636][PID:113130][Thread-140063711504128][LWP-113136] Waiting logfile0 to archive [2019/03/07 16:08:32 637][PID:113130][Thread-140063711504128][LWP-113136] Database-Level Backup Completed [SUCCESS]
101 / 166 TRACE FILE altibase_rp.log 이중화시작 / 중지및장애상황에대한정보 REPLICATION_LOCK_TIMEOUT에의한오류정보 REPLICATION_RECEIVE_TIMEOUT에의한오류정보 altibase_rp.log SAMPLE 이중화시작 Sender [2019/03/18 10:59:02 617][PID:104294][Thread-140429585733376][LWP-104376] [Sender] Replication REP1:0 Start... at [4295287685] Receiver [2019/03/18 10:58:53 613][PID:104294][Thread-140429440194304][LWP-104388] [Receiver] Replication REP1 Started...
TRACE FILE 이중화시작 Sender [2019/03/18 11:00:43 61A][PID:104294][Thread-140429585733376][LWP-104376] SEND Stop Message! [2019/03/18 11:00:43 61B][PID:104294][Thread-140429585733376][LWP-104376] SEND Stop Message SUCCESS!!! [2019/03/18 11:00:43 61C][PID:104294][Thread-140429597861632][LWP-104375] [SenderApply] Replication REP1 Normal End [2019/03/18 11:00:43 61D][PID:104294][Thread-140429585733376][LWP-104376] [Sender] Stop sender thread REP1:0 at [4295288674], Restart SN[4295287685] Restart SN 은다음이중화를재시작할때해당값이기록된로그부터재전송을하겠다는의미 Receiver [2019/03/18 11:00:43 584][PID:7301][Thread-140021822617344][LWP-7407] [Receiver] Replication Stop Message is arrived [2019/03/18 11:00:43 585][PID:7301][Thread-140021822617344][LWP-7407] [Receiver] RepName:REP1 is processed at [Last Processed SN:4295288674] [2019/03/18 11:00:43 586][PID:7301][Thread-140021822617344][LWP-7407] [Receiver] RepName:REP1 is received at [Last Received SN:4295288674] [2019/03/18 11:00:43 587][PID:7301][Thread-140021822617344][LWP-7407] [Receiver] Normal Stop [2019/03/18 11:00:43 588][PID:7301][Thread-140021822617344][LWP-7407] [Receiver] Replication REP1 Stopped... 102 / 166
103 / 166 TRACE FILE 이중화 SYNC Sender [2019/03/18 11:04:30 637][PID:104294][Thread-140429597861632][LWP-104375] [PJChild] [0] PJ_RUN [2019/03/18 11:04:30 638][PID:104294][Thread-140429597861632][LWP-104375] [PJChild] [0] TABLE TEST1 SYNC START [2019/03/18 11:04:30 639][PID:104294][Thread-140429597861632][LWP-104375] [PJChild] [0] TABLE: TEST1, PROCESSED: 5, TUPLE: 5 sync 할대상테이블및레코드건수 [2019/03/18 11:04:30 63A][PID:104294][Thread-140429597861632][LWP-104375] [PJ Child] SEND Stop Message! [2019/03/18 11:04:30 63B][PID:104294][Thread-140429597861632][LWP-104375] [PJ Child] SEND Stop Message SUCCESS!!! sync 완료후 sync 중지 [2019/03/18 11:04:30 63C][PID:104294][Thread-140429597861632][LWP-104375] [PJChild] [0] PJ_EXIT [2019/03/18 11:04:31 63D][PID:104294][Thread-140429440194304][LWP-104388] Succeeded to insert data. [2019/03/18 11:04:32 63E][PID:104294][Thread-140429440194304][LWP-104388] Succeeded to rebuild indexes. [2019/03/18 11:04:32 63F][PID:104294][Thread-140429440194304][LWP-104388] [Sender] Replication REP1:0 Start... at [4295300681] sender 자동재구동
104 / 166 TRACE FILE 이중화 SYNC Receiver [2019/03/18 11:04:30 58F][PID:7301][Thread-140021822617344][LWP-7407] [Receiver] Replication REP1 Started... receiver 자동재구동 [2019/03/18 11:04:30 590][PID:7301][Thread-140022755325696][LWP-7355] [Receiver] Replication REP1 Started... sync 용 receiver 구동 [2019/03/18 11:04:30 591][PID:7301][Thread-140022755325696][LWP-7355] [Receiver] Replication Stop Message is arrived sync 용 receiver 종료 [2019/03/18 11:04:30 592][PID:7301][Thread-140022755325696][LWP-7355] [Receiver] RepName:REP1 is processed at [Last Processed SN:18446744073709551615] [2019/03/18 11:04:30 593][PID:7301][Thread-140022755325696][LWP-7355] [Receiver] RepName:REP1 is received at [Last Received SN:0]
TRACE FILE Sender 비정상종료 Sender 비정상종료되어 Sender 관련로그기록불가 Receiver [2019/03/21 13:43:19 680][PID:10233][Thread-139675223820032][LWP-10326] ERR-7101a(errno=16) Connection closed 단절감지 [2019/03/21 13:43:19 680][PID:10233][Thread-139675223820032][LWP-10326] ERR-7101a(errno=16) Connection closed [2019/03/21 13:43:19 6DA][PID:2343][Thread-140022664775424][LWP-2456] ERR-61048(errno=62) [Receiver] REP1 receiver has recvxlog error in run() [2019/03/21 13:43:19 6DB][PID:2343][Thread-140022664775424][LWP-2456] [Receiver] RepName:REP1 is processed at [Last Processed SN:313534027962] [2019/03/21 13:43:19 6DC][PID:2343][Thread-140022664775424][LWP-2456] [Receiver] RepName:REP1 is received at [Last Received SN:313534027962] [2019/03/21 13:43:19 6DD][PID:2343][Thread-140022664775424][LWP-2456] ERR-6104b(errno=62) [Receiver] REP1 receiver is ended (by thr_exit) [2019/03/21 13:43:19 6DE][PID:2343][Thread-140022664775424][LWP-2456] Error Stop! [2019/03/21 13:43:19 6DF][PID:2343][Thread-140022664775424][LWP-2456] [Receiver] Replication REP1 Stopped... Receiver 중단 105 / 166
TRACE FILE Sender 복구후 Sender [2019/03/21 13:46:12 667][PID:3713][Thread-140548569315072][LWP-3811] [SenderApply] Replication REP1 Start [2019/03/21 13:46:12 668][PID:3713][Thread-140548825384704][LWP-3784] [Sender] Replication REP1:0 Start... at [322131036108] Receiver [2019/03/21 13:46:12 675][PID:3713][Thread-140548544927488][LWP-3813] [Receiver] Replication REP1 Started... 106 / 166
TRACE FILE Receiver 비정상종료 Receiver 비정상종료되어 Receiver 관련로그기록불가 Sender [2019/03/21 13:43:19 680][PID:10233][Thread-139675223820032][LWP-10326] ERR-7101a(errno=16) Connection closed 연결단절감지 [2019/03/21 13:43:19 681][PID:10233][Thread-139675599795968][LWP-10295] ERR-620f0(errno=11) [Sender] Stop sender thread REP1:0 at [313534027962], Restart SN[313534025907] Sender 중단 [2019/03/21 13:43:19 682][PID:10233][Thread-139675599795968][LWP-10295] [Sender] getnextlastusedhostno: from 192.168.1.62:40700 to 192.168.1.62:40700 [2019/03/21 13:43:19 683][PID:10233][Thread-139675599795968][LWP-10295] ERR-71017(errno=111) Failed to invoke the connect() system function, errno=111 이중화백업라인체크 [2019/03/21 13:43:19 684][PID:10233][Thread-139675599795968][LWP-10295] [Sender] getnextlastusedhostno: from 192.168.1.62:40700 to 192.168.1.62:40700 [2019/03/21 13:43:19 685][PID:10233][Thread-139675599795968][LWP-10295] ERR-61022(errno=111) [Sender] Sender Sleep : 60 seconds 다음재접속시도까지 (REPLICATION_SENDER_SLEEP_TIMEOUT=60 초 ) 만큼 Sleep 107 / 166
TRACE FILE 60 초후 Receiver 복구안되는경우 장애시점로그와동일한 connection 오류발생하고이중화백업라인시도후실패하게되면 Sender 다시 sleep [2019/03/21 13:44:19 686][PID:10233][Thread-139675599795968][LWP-10295] ERR-71017(errno=111) Failed to invoke the connect() system function, errno=111 [2019/03/21 13:44:19 687][PID:10233][Thread-139675599795968][LWP-10295] [Sender] getnextlastusedhostno: from 192.168.1.62:40700 to 192.168.1.62:40700 [2019/03/21 13:44:19 688][PID:10233][Thread-139675599795968][LWP-10295] ERR-61022(errno=111) [Sender] Sender Sleep : 60 seconds [2019/03/21 13:45:19 689][PID:10233][Thread-139675599795968][LWP-10295] ERR-71017(errno=111) Failed to invoke the connect() system function, errno=111 [2019/03/21 13:45:19 68A][PID:10233][Thread-139675599795968][LWP-10295] [Sender] getnextlastusedhostno: from 192.168.1.62:40700 to 192.168.1.62:40700 [2019/03/21 13:45:19 68B][PID:10233][Thread-139675599795968][LWP-10295] ERR-61022(errno=111) [Sender] Sender Sleep : 60 seconds Receiver 복구이후로그는 Sender 복구로그와동일 108 / 166
TRACE FILE REPLICATION_RECEIVE_TIMEOUT 에러 Sender -- Timeout 이발생한기록 [2013/11/30 16:13:03] [Thread-6786] [Level-0] ERR-61075(errno=16) Timeout exceed. -- 반복적으로재접속이발생 [2013/11/30 16:36:02] [Thread-6529] [Level-0] ERR-620f0(errno=16) [Sender] Stop sender thread REP1:0 at [785419687], Restart SN[783217166] [2013/11/30 16:36:07] [Thread-6529] [Level-0] [Sender] getnextlastusedhostno: from 192.168.1.131:37585 to 192.168.1.131:37585 [2013/11/30 16:36:07] [Thread-6529] [Level-0] ERR-7101a(errno=0) Connection closed [2013/11/30 16:36:07] [Thread-6529] [Level-0] ERR-61003(errno=0) Unable to read from a socket [2013/11/30 16:36:07] [Thread-6529] [Level-0] [Sender] getnextlastusedhostno: from 192.168.1.131:37585 to 192.168.1.131:37585 [2013/11/30 16:36:07] [Thread-6529] [Level-0] ERR-61022(errno=0) [Sender] Sender Sleep : 60 seconds [2013/11/30 16:37:07] [Thread-6529] [Level-0] ERR-7101a(errno=0) Connection closed [2013/11/30 16:37:07] [Thread-6529] [Level-0] ERR-61003(errno=0) Unable to read from a socket 109 / 166
TRACE FILE REPLICATION_RECEIVE_TIMEOUT 에러 Receiver Receiver 데이터베이스의 lock 대기로 timeout 발생의경우 [2013/11/30 16:38:07] [Thread-5956] [Level-0] ERR-61030(errno=11) [Receiver] Failed to build meta information Sender 에의해재구동 [2013/11/30 16:45:18] [Thread-6486] [Level-0] ERR-7101a(errno=32) Connection closed [2013/11/30 16:45:18] [Thread-6486] [Level-0] ERR-61048(errno=32) [Receiver] REP1 receiver has recvxlog error in run() [2013/11/30 16:45:39] [Thread-6486] [Level-0] ERR-71032(errno=76) Unable to shutdown the socket [2013/11/30 16:45:39] [Thread-6486] [Level-0] ERR-61087(errno=76) [Network] Shutdown link operation is failed [2013/11/30 16:45:39] [Thread-6486] [Level-0] ERR-6104b(errno=76) [Receiver] REP1 receiver is ended (by thr_exit) [2013/11/30 16:45:39] [Thread-6486] [Level-0] Error Stop! [2013/11/30 16:45:39] [Thread-6486] [Level-0] [Receiver] Replication REP1 Stopped... 110 / 166
TRACE FILE altibase_rp_conflict.log conflict 발생시해당 SQL 및 conflict 유형정보기록 Insert Duplicate 에러 Sender 로부터수신한 Insert 데이터와동일한 PK 를가진데이터가 Receiver 측데이터베이스에이미존재할경우에러기록 [2019/03/21 13:56:17 68A][PID:3713][Thread-140548544927488][LWP-3813] ERR-11058(errno=62) The row already exists in a unique index. [2019/03/21 13:56:17 68B][PID:3713][Thread-140548544927488][LWP-3813] INSERT INTO SYS.TEST1 VALUES ( 100, 'aaaa' ); (TID : 20320) [2019/03/21 13:56:17 68C][PID:3713][Thread-140548544927488][LWP-3813] COMMIT (TID : 20320) Update Not Found 에러 Sender 로부터수신한 Update 에해당하는 PK 를가진데이터가 Receiver 측데이터베이스에존재하지않을경우에러기록 [2019/03/21 13:58:03 690][PID:3713][Thread-140548544927488][LWP-3813] ERR-610f7(errno=62) [Receiver] Unable to find record in executeupdate() function [2019/03/21 13:58:03 691][PID:3713][Thread-140548544927488][LWP-3813] UPDATE SYS.TEST1 SET C2 = 'bbbb' WHERE C1 = 101; (TID : 26464) [2019/03/21 13:58:03 692][PID:3713][Thread-140548544927488][LWP-3813] COMMIT (TID : 26464) 111 / 166
112 / 166 TRACE FILE Update Conflict 에러 Sender 에서 Update 를수행했던시점의변경대상컬럼이가지는변경전값과 Receiver 데이터베이스의변경대상컬럼이가지는현재값이다를경우에러기록 Sender 데이터베이스는 Update SQL 에대해변경대상컬럼의변경전 / 후값을함께전송하여비교후 Update 수행 [2019/03/21 13:57:12 68D][PID:3713][Thread-140548544927488][LWP-3813] ERR-61035(errno=62) [Receiver] An update conflict occurred. [2019/03/21 13:57:12 68E][PID:3713][Thread-140548544927488][LWP-3813] UPDATE SYS.TEST1 SET C2 = 'bbbb' WHERE C1 = 100; (TID : 24416) [2019/03/21 13:57:12 68F][PID:3713][Thread-140548544927488][LWP-3813] COMMIT (TID : 24416) Delete Not Found 에러 Sender 로부터수신한 Deelte 에해당하는 PK 를가진데이터가 Receiver 측데이터베이스에존재하지않을경우에러기록 [2019/03/21 13:58:35 693][PID:3713][Thread-140548544927488][LWP-3813] ERR-610f7(errno=62) [Receiver] Unable to find record in executedelete() function [2019/03/21 13:58:35 694][PID:3713][Thread-140548544927488][LWP-3813] DELETE FROM SYS.TEST1 WHERE C1 = 101; (TID : 28512) [2019/03/21 13:58:35 695][PID:3713][Thread-140548544927488][LWP-3813] COMMIT (TID : 28512)
113 / 166 ALTIBASE OPERATION PERFORMANCE VIEW
114 / 166 PERFORMANCE VIEW ALTIBASE 성능뷰 시스템통계정보 session statement lock service thread 메모리 ager buffer logfile 테이블스페이스 usage 테이블 usage 메모리 usage 이중화
115 / 166 PERFORMANCE VIEW V$SYSSTAT NAME VALUE 시스템상태정보 3 초마다정보갱신 적절한주기를두고전, 후의값을비교하여각항목의증가추이관찰 시스템의부하항목확인 칼럼정보 칼럼 sample SQL 시스템각상태의이름 각상태값의누적치 isql> SELECT TO_CHAR(SYSDATE,'HH:MI:SS'), name, value FROM V$SYSSTAT 2 WHERE name IN ('logon cumulative', 'execute success count', 'prepare success count', 3 'memory table cursor full scan count', 'memory table cursor index scan count', 4 'disk table cursor full scan count', 'disk table cursor index scan count', 5 'update retry count', 'lock row retry count' 6 ); 내용
116 / 166 PERFORMANCE VIEW V$SESSTAT 접속된모든세션통계치 접속이끊겨진세션의정보는삭제 칼럼정보 칼럼 SID 세션 ID NAME 시스템각상태의이름 VALUE 각상태값의누적치 내용 sample SQL isql> SELECT sid, TO_CHAR(SYSDATE,'HH:MI:SS'), name, value FROM V$SESSTAT 2 WHERE name IN ('logon cumulative', 'execute success count', 'prepare success count', 3 'memory table cursor full scan count', 'memory table cursor index scan count', 4 'disk table cursor full scan count', 'disk table cursor index scan count', 5 'update retry count', 'lock row retry count' 6 );
117 / 166 PERFORMANCE VIEW V$SESSION ALTIBASE 내부에생성된 CLIENT 세션정보 칼럼정보 칼럼 내용 ID 세션 ID TRANS_ID 현재사용하고있는 TRANSACTION ID TASK_STATE WATING, READY, EXECUTING, QUEUE WAIT, QUEUE READY, UNKNOWN COMM_NAME 클라이언트의접속정보 OPENED_STMT_COUNT statement 개수 CLIENT_PID CLIENT 프로세스 ID AUTOCOMMIT_FLAG autocommit 모드확인 (0/1) SESSION_STATE CURRENT_STMT_ID LOGIN_TIME INIT, AUTH, SERVICE READY, SERVICE, END, ROLLBACK, UNKNOWN 현재수행중인 statement ID. recursive SQL 은제외 CLIENT 접속시간 TO_CHAR(TO_DATE('1970010109','yyyymmddhh24') + login_time/60/60/24, 'yyyymmdd hh:mi:ss')
118 / 166 PERFORMANCE VIEW V$SESSIONMGR 세션통계정보 비정상종료된세션누적통계 칼럼 내용 IDLE_TIMEOUT_COUNT 발생된 idle timeout의횟수 QUERY_TIMEOUT_COUNT 발생된 query timeout의횟수 DDL_TIMEOUT_COUNT 발생된 DDL timeout의횟수 FETCH_TIMEOUT_COUNT 발생된 fetch timeout의횟수 UTRANS_TIMEOUT_COUNT 발생된 utrans timeout의횟수 SESSION_TERMINATE_COUNT sysdba에의해강제로연결이끊긴횟수
119 / 166 PERFORMANCE VIEW sample SQL 접속유형별세션수 isql> SELECT SUBSTR(comm_name, 1,4) con_type, COUNT(*) cnt 2 FROM V$SESSION 3 GROUP BY SUBSTR(comm_name, 1,4); CON_TYPE CNT ------------------------------------------------------------------ TCP 105 UNIX 1 IPC 100 비정상종료된세션누적치 isql> SELECT login_timeout_count, idle_timeout_count, query_timeout_count, 2 fetch_timeout_count, utrans_timeout_count, session_terminate_count 3 FROM V$SESSIONMGR; LOGIN_TIMEOUT_COUNT : 0 IDLE_TIMEOUT_COUNT : 0 QUERY_TIMEOUT_COUNT : 10 FETCH_TIMEOUT_COUNT : 0 UTRANS_TIMEOUT_COUNT : 0 SESSION_TERMINATE_COUNT : 0
120 / 166 PERFORMANCE VIEW V$STATEMENT 현재연결된세션별로가장최근에실행된구문 (statement) 정보 LONG RUN QUERY 확인 time 정보를수집하기위해서는 TIMED_STATISTICS=1로설정 time 정보는 microsec 단위 칼럼정보 칼럼 ID statement ID SESSION_ID 세션 ID TX_ID 해당 SQL이속해있는 TRANSACTION ID QUERY 실제 SQL 문장 (16Kbyte까지만표현 ) TOTAL_TIME SQL이최종수행된시점의전체소요시간 설명 EXECUTE_TIME FETCH_TIME PARSE_TIME VALIDATE_TIME SQL 이 DBMS 내부에서처리된순수소요시간 (SELECT 의경우첫번째 FETCH 가일어나지전까지수행된시간 ) 최종 SQL 이데이터베이스와프로그램간발생한통신의누적소요시간 parse 하는데소요된시간 validation 체크하는데소요된시간
PERFORMANCE VIEW 칼럼정보 칼럼 설명 EXECUTE_SUCCESS 동일한 SQL 이성공적으로수행된누적횟수 ( 동일세션에서누적치 ) PROCESS_ROW EVENT WAIT_TIME SECOND_IN_TIME INSERT/UPDATE/DELETE/MOVE 문으로처리된레코드수대기이벤트명대기로인해소모된시간을의미하며 millisecond 단위대기로인해소모된시간을의미하며 second단위 sample SQL 전체 statement 개수 isql> SELECT COUNT(*) stmt_cnt FROM V$STATEMENT; 쿼리정보 isql> ALTER SYSTEM SET TIMED_STATISTICS=1; isql> SELECT session_id, id stmt_id, tx_id, 2 (parse_time+validate_time+optimize_time) prepare_time, fetch_time, execute_time, 3 total_time, execute_flag, 4 DECODE(last_query_start_time, 0, '-', TO_CHAR(TO_DATE('1970010109', 'yyyymmddhh') 5 + last_query_start_time / (24*60*60), 'mm/dd hh:mi:ss')) 6 last_start_time, NVL(LTRIM(query), 'NONE') query 7 FROM V$STATEMENT 8 ORDER BY execute_time DESC ; 121 / 166
122 / 166 PERFORMANCE VIEW V$LOCK 모든테이블에대한 lock 노드정보 칼럼정보 칼럼 LOCK_ITEM_TYPE TBS_ID TABLE_OID TRANS_ID LOCK_DESC 설명 LOCK이획득된대상의종류 (TBL, TBS, DBF) LOCK이획득된대상이속한테이블스페이스 ID LOCK이획득된테이블의 OID TRANSACTION ID LOCK 유형 (X_LOCK, IX_LOCK, IS_LOCK) IS_GRANT 테이블 level 의 LOCK 을획득했는지여부 (1: 획득 0: 대기 )
123 / 166 PERFORMANCE VIEW V$LOCK_WAIT TRANSACTION 간의 lock 대기정보 칼럼정보 칼럼 설명 TRANS_ID WAIT_FOR_TRANS_ID TRANSACTION 의고유번호 TRANS_ID 가대기하고하는 TRANSACTION 의고유번호
124 / 166 PERFORMANCE VIEW V$TRANCSACTION 현재수행중인모든 TRANSACTION 정보 주로 V$LOCK, V$MEMGC등다른뷰와조인해서사용 칼럼정보 칼럼 설명 ID SESSION_ID STATUS LOG_TYPE FIRST_UPDATE_TIME DDL_FLAG FIRST_UNDO_NEXT_LSN_FILENO UPDATE_SIZE MEMORY_VIEW_SCN TRANSACTION ID 세션 ID 0: BEGIN, 1: PRECOMMIT, 2: COMMIT_IN_MEMORY, 3: COMMIT, 4: ABORT, 5: BLOCKED, 6: END 0: 일반, 1: 이중화관련 최초변경이일어난시각 TO_CHAR(TO_DATE('1970010109','YYYYMMDDHH') + first_update_time / (60*60*24), 'MM/DD HH:MI:SS')) 0: non-ddl, 1: DDL TRANSACTION 이처음기록한로그의파일번호 UPDATE 시작성된로그의크기 LOCK_ESCALATION_MEMORY_SIZE 설정값보다크면 in-place MVCC 로동작 메모리테이블에대해열려있는커서의 view SCN 중가장작은값
125 / 166 PERFORMANCE VIEW sample SQL lock 잡고있는 SQL 확인 isql> SELECT tx.id TX_ID, lw.wait_for_trans_id BLOCKED_TX_ID, l.lock_desc, 2 DECODE(tx.log_type, 0, st.db_username, 'REPLICATION') USER_NAME, 3 DECODE(tx.first_update_time, 0, '0', to_char(to_date('1970010109','yyyymmddhh') 4 + tx.first_update_time / (60*60*24), 'MM/DD HH:MI:SS')) FIRST_UPDATE_TIME, 5 DECODE(tx.status, 0, 'BEGIN', 1, 'PRECOMMIT', 2, 'COMMIT_IN_MEMORY',3, 'COMMIT', 6 4, 'ABORT', 5, 'BLOCKED', 6, 'END') STATUS, st.query current_query 7 FROM V$TRANSACTION tx, V$LOCK l LEFT OUTER JOIN V$LOCK_WAIT lw ON l.trans_id = lw.trans_id 8 LEFT OUTER JOIN (SELECT st.query,tx_id, ss.db_username 9 FROM V$STATEMENT st, V$SESSION ss 10 WHERE ss.id = st.session_id ) st 11 ON l.trans_id = st.tx_id 12 WHERE tx.id = l.trans_id; TX_ID : 103489 BLOCKED_TX_ID : LOCK_DESC : IX_LOCK USER_NAME : SYS FIRST_UPDATE_TIME : 09/02 14:42:35 STATUS : BEGIN CURRENT_QUERY : update t1 set c1=1 where c1 between 1.11 and 1.112 TX_ID : 4288 BLOCKED_TX_ID : 103489 LOCK_DESC : IX_LOCK FIRST_UPDATE_TIME : 0 STATUS : BLOCKED CURRENT_QUERY : update t1 set c1=1 where c1 =1.11
126 / 166 PERFORMANCE VIEW V$SERVICE_THREAD service thread 정보 칼럼정보 칼럼 설명 TYPE STATE RUN_MODE SESSION_ID STATEMEMT_ID TASK_COUNT REDAY_TASK_COUNT service thread 접속방법 SOCKET: TCP 혹은 Unix Domain 방식 IPC: IPC 방식 service thread 현재상태 NONE: service thread 초기화상태 POLL: service thread 가이벤트를대기하는상태 QUEUE-WAIT: service thread 가 queue 를대기하는상태 EXECUTE: service thread 가 statement 를수행중인상태 service thread 운영모드 SHARED: TCP 로연결된작업을처리 DEDICATED: IPC 로연결된작업을처리 service thread 가수행중인 session ID service thread 가수행중인 statement ID service thread 에할당된 session 개수 Service thread 가요청을처리해주기를대기하고있는 session 수
PERFORMANCE VIEW sample SQL service thread 의상태확인 isql> SELECT RPAD(type, 30), state, count(*) 2 FROM V$SERVICE_THREAD 3 GROUP BY type, state; RPAD(TYPE, 30) STATE COUNT --------------------------------------------------------------------- SOCKET EXECUTE 1 SOCKET POLL 7 IPC EXECUTE 1 IPC POLL 9 127 / 166
PERFORMANCE VIEW V$MEMGC 메모리 garbage collection 정보확인 aging 할대상증가여부확인 GC가대기하는 TRANSACTION 조회 V$TRANSACTION 과 V$STATEMENT와조인 칼럼정보 칼럼 설명 GC_NAME MINMEMSCNINITX ADD_OID_CNT GC_OID_CNT GC 이름 MEM_LOGICAL_AGER 는인덱스의 old version 을삭제하는 GC MEM_DELTHR 는테이블레코드의 old version 을삭제하는 GC 메모리관련 TRANSACTION 중가장작은 view SCN ALTIBASE 가장오래된 old version 의번호 aging 을위해추가된 OID list 개수 aging 된 OID list 개수 128 / 166
PERFORMANCE VIEW sample SQL 메모리 ager 의 gap 증가확인 isql> SELECT gc_name, add_oid_cnt, gc_oid_cnt, add_oid_cnt - gc_oid_cnt gcgap 2 FROM V$MEMGC; GC_NAME ADD_OID_CNT GC_OID_CNT GCGAP ----------------------------------------------------------------------- MEM_LOGICAL_AGER 1275 1275 0 MEM_DELTHR 1275 1275 0 GC GAP(ADD_OID_CNT - GC_OID_CNT) 값이증가되고있다면, aging 할대상이증가 129 / 166
PERFORMANCE VIEW V$LFG 로그파일이미처생성되지못해 TRANSACTION 이로그파일이생성될때까지대기한수확인 칼럼정보 칼럼 설명 CUR_WRITE_LF_NO LF_PREPARE_COUNT LF_PREPARE_WAIT_COUNT END_LSN_FILE_NO END_LSN_OFFSET 기록로그파일번호미리생성한로그파일의수로그스위치시대기한횟수 restart redo가시작될 LSN의파일번호 restart redo가시작될 LSN의오프셋 sample SQL 로그파일이생성되기를기다린수 isql> SELECT lf_prepare_wait_count FROM V$LFG; LF_PREPARE_WAIT_COUNT ------------------------ 0 130 / 166
131 / 166 PERFORMANCE VIEW V$MEM_TABLESPACES 메모리테이블스페이스정보 메모리테이블스페이스의사용량확인 칼럼정보 칼럼 SPACE_ID 테이블스페이스 ID 설명 SPACE_NAME MAXSIZE ALLOC_PAGE_COUNT FREE_PAGE_COUNT 테이블스페이스이름 테이블스페이스최대크기 DECODE(MAXSIZE, 0, ALLOC_PAGE_COUNT*PAGE_SIZE, MAXSIZE) 테이블스페이스의전체페이지개수 테이블스페이스의 free 페이지개수
PERFORMANCE VIEW sample SQL 메모리테이블스페이스사용량조회 isql> SELECT space_id, space_name, autoextend_mode, 2 DECODE(maxsize, 140737488322560, 'UNDEFINED', 3 0, alloc_page_count*32/1024, 4 maxsize/1024/1024) 'MAX(M)', 5 alloc_page_count * 32/1024 'TOTAL(M)', 6 (alloc_page_count-free_page_count)*32/1024 'ALLOC(M)', 7 ((alloc_page_count-free_page_count)*32/1024) 8 /DECODE(maxsize, 0, alloc_page_count*32/1024, maxsize/1024/1024) 'USAGE(%)' 9 FROM V$MEM_TABLESPACES; MAX(M) - 메모리테이블스페이스 maxsize 테이블스페이스생성시지정 TOTAL(M) - 메모리테이블스페이스가현재까지할당받은크기 ALLOC(M) - 메모리테이블스페이스가현재까지할당받은페이지중빈페이지를제외한사용공간 USAGE(%) - 메모리테이블스페이스가최대로할당할수있는크기대비사용중인공간에대한백분율 132 / 166
133 / 166 PERFORMANCE VIEW V$TABLESPACES 전체테이블스페이스 ( 디스크 / 메모리 ) 정보 칼럼정보 칼럼 ID 테이블스페이스 ID 설명 NAME TYPE STATE SEGMENT_MANAGEMENT TOTAL_PAGE_COUNT ALLOCATE_PAGE_COUNT PAGE_SIZE EXTENT_PAGE_COUNT 테이블스페이스이름 테이블스페이스타입 테이블스페이스상태 테이블스페이스에서세그먼트를생성할때어떤타입으로생성할것인지나타냄 (AUTO, BITMAP, CIRCULAR) 테이블스페이스의전체페이지개수 테이블스페이스에할당된페이지개수 테이블스페이스의페이지크기 extent 의페이지개수
134 / 166 PERFORMANCE VIEW V$DATAFILES 디스크테이블스페이스데이터파일정보 데이터파일의사용량확인 칼럼정보 ID NAME SPACEID 칼럼 데이터파일 ID 데이터파일경로와이름 데이터파일이속한테이블스페이스 ID 설명 MAXSIZE INITSIZE NEXTSIZE CURRSIZE AUTOEXTEND STATE 데이터파일생성시지정한 MAXSIZE AUTOEXTEND OFF 이면 0 데이터파일생성시지정한 SIZE 데이터파일생성시지정한 NEXT AUTOEXTEND OFF 이면 0 데이터파일의현재크기 AUTOEXTEND OFF 이면 INITSIZE 와같음 0: OFF, 1: ON 1: 오프라인, 2: 온라인, 4: 백업시작, 8: 백업종료, 128: 삭제 (dropped)
PERFORMANCE VIEW sample SQL 디스크테이블스페이스의데이터파일별사용량확인 isql> SELECT b.name tbs_name, a.id 'FILE#', a.name datafile_name, 2 currsize*8/1024 'ALLOC(M)', 3 ROUND(CASE2(a.maxsize=0, currsize, a.maxsize)*8/1024) 'MAX(M)', 4 DECODE(autoextend, 0, 'OFF', 'ON') 'AUTOEXTEND' 5 FROM V$DATAFILES a, 6 V$TABLESPACES b 7 WHERE b.id = a.spaceid 8 ORDER BY b.name, a.id; ALLOC(M) - 데이터파일의현재크기 MAX(M) - 데이터파일이 AUTOEXTEND ON 으로생성되었을경우에확장될수있는최대크기 AUTOEXTEND OFF 로생성되었다면생성시크기 135 / 166
136 / 166 PERFORMANCE VIEW V$MEMTBL_INFO 메모리테이블정보 메모리테이블사용량확인 칼럼정보 TABLESPACE_ID 칼럼 테이블스페이스 ID 설명 TABLE_OID FIXED_ALLOC_MEM FIXED_USED_MEM VAR_ALLOC_MEM VAR_USED_MEM UNIQUE_VIOLATION_COUNT UPDATE_RETRY_COUNT DELETE_RETRY_COUNT 테이블식별자 system_.sys_tables_ 와조인하여 table_name 확인 테이블에서할당한고정영역의메모리크기 테이블에서실제사용하고있는고정영역의메모리크기 테이블에서할당한가변영역의메모리크기 테이블에서실제사용하고있는가변영역메모리크기 UNIQUE 제약조건이위반된횟수 UPDATE 시재시도한횟수 DELETE 시재시도한횟수
PERFORMANCE VIEW sample SQL 휘발성테이블스페이스와메모리테이블스페이스에속한테이블사용량확인 isql> SELECT a.user_name, b.table_name, d.name tablespace_name, 2 (c.fixed_alloc_mem + c.var_alloc_mem)/(1024*1024) 'ALLOC(M)', 3 (c.fixed_used_mem + c.var_used_mem)/(1024*1024) 'USED(M)', 4 (c.fixed_used_mem + c.var_used_mem)/(c.fixed_alloc_mem + c.var_alloc_mem)*100 5 'EFFICIENCY(%)' 6 FROM SYSTEM_.SYS_USERS_ a, SYSTEM_.SYS_TABLES_ b, V$MEMTBL_INFO c, V$TABLESPACES d 7 WHERE a.user_name <> 'SYSTEM_' 8 AND b.table_type = 'T' 9 AND a.user_id = b.user_id 10 AND b.table_oid = c.table_oid 11 AND b.tbs_id = d.id 12 ORDER BY 4 DESC ; ALLOC(M) - 테이블이할당받은메모리합계 (FIXED_ALLOC_MEM+VAR_ALLOC_MEM) USED(M) - 테이블이할당받은페이지중에서 실제로데이터가적재된페이지 의메모리합계 (FIXED_USED_MEM+VAR_USED_MEM) 예를들어, ALLOC 이 100M 인테이블에전체 DELELE 수행하면 ALLOC 은변함없으나 USED 는 0 에가까움 EFFICIENCY(%) - 테이블이소유한페이지중 실제로데이터가적재된페이지 에대한백분율로공간효율성을나타냄 137 / 166
138 / 166 PERFORMANCE VIEW V$DISKTBL_INFO 디스크테이블정보 디스크테이블사용량확인 칼럼정보 TABLESPACE_ID 칼럼 테이블스페이스 ID 설명 TABLE_OID DISK_PAGE_CNT 테이블식별자 system_.sys_tables_ 와조인하여 table_name 확인 테이블에서데이터를갖고있는페이지개수 sample SQL isql> SELECT user_name, a.table_name, d.name tbs_name, 2 ROUND((b.disk_page_cnt*8)/1024) 'ALLOC(M)' 3 FROM SYSTEM_.SYS_TABLES_ a, V$DISKTBL_INFO b, SYSTEM_.SYS_USERS_ c, V$TABLESPACES d 4 WHERE a.table_oid = b.table_oid 5 AND a.user_id = c.user_id 6 AND a.tbs_id=d.id 7 AND c.user_name <> 'SYSTEM_'
139 / 166 PERFORMANCE VIEW V$REPSENDER 이중화 sender 정보 이중화 sender가동작중일때만확인가능 칼럼정보 칼럼 설명 REP_NAME STATUS NET_ERROR_FLAG REPL_MODE XSN START_FLAG 이중화이름 sender 의현재상태 0: STOP, 1: RUN, 2: RETRY 네트워크오류여부 0: OK 1: ERROR 이중화가설정된모드 EAGER, LAZY remote 로전송한로그의일련번호 이중화 start 시지정한옵션 NORMAL: 0, QUICK: 1, SYNC: 2, SYNC_ONLY: 3, SYNC RUN : 4, SYNC END: 5, RECOVERY from Replication : 6, OFFLINE: 7
PERFORMANCE VIEW V$REPRECEIVER 이중화 receiver 정보 remote SERVER의 sender가 start되면확인가능 칼럼정보 칼럼 설명 REP_NAME APPLY_XSN INSERT_SUCCESS_COUNT INSERT_FAILURE_COUNT UPDATE_SUCCESS_COUNT UPDATE_FAILURE_COUNT DELETE_SUCCESS_COUNT DELETE_FAILURE_COUNT 이중화이름 Receiver가적용중인로그의 SN Receiver가성공적으로적용한 INSERT 로그레코드의수 Receiver가적용에실패한 INSERT 로그레코드의수 Receiver가성공적으로적용한 UPDATE 로그레코드의수 Receiver가적용에실패한 UPDATE 로그레코드의수 Receiver가성공적으로적용한 DELETE 로그레코드의수 Receiver가적용에실패한 DELETE 로그레코드의수 SUCCESS_COUNT, FAILURE_COUNT TIMED_STATISTICS=1 로설정되어있는경우만확인가능 140 / 166
141 / 166 PERFORMANCE VIEW V$REPGAP 이중화 sender의작업로그와 local SERVER에생성된최근로그파일간의차이 이중화가정상적으로수행되고있는지, 밀리지는않는지확인할때사용 이중화 sender가동작중일때만확인가능 칼럼정보 칼럼 설명 REP_NAME REP_SN REP_LAST_SN REP_GAP READ_FILE_NO START_FLAG 이중화이름 현재전송중인로그레코드식별번호 마지막로그레코드식별번호 REP_LAST_SN 과 REP_SN 의차이 현재읽고있는로그파일번호 이중화 start 시지정한옵션 NORMAL : 0, QUICK : 1, SYNC: 2, SYNC_ONLY: 3, SYNC RUN : 4, SYNC END: 5, RECOVERY from Replication : 6, OFFLINE : 7, PARALLEL : 8
142 / 166 PERFORMANCE VIEW sample SQL Sender 확인 isql> SELECT rep_name, status FROM V$REPSENDER; REP_NAME STATUS ----------------------------------------------------------- REP1 1 status 가 1 이아닐경우이중화는정상적이않음 Receiver 확인 isql> SELECT rep_name FROM V$REPRECEIVER; REP_NAME ----------------------------------- REP1 데이터가조회되지않을경우 receiver 가정상적이지않음 이중화갭확인 isql> SELECT rep_name, rep_last_sn, rep_sn, rep_last_sn-rep_sn FROM V$REPGAP; REP_NAME REP_LAST_SN REP_SN REP_LAST_SN-REP_SN ----------------------------------------------------------------------- REP 12638584-1 12638585 rep_sn 값이 -1 이면원격 SERVER 에이중화를생성하지않음 rep_last_sn-rep_sn 값이증가하는데 rep_sn 값이변하지않으면이중화장애
143 / 166 ALTIBASE OPERATION OS CHECK LIST
144 / 166 OS CHECK LIST ALTIBASE 프로세스확인 Shell> ps -ef grep "altibase -p" grep -v grep altibase 11300 1 0 Sep22? 00:00:10 /altibase/altibase_home/bin/altibase -p boot from admin CPU 사용률 Shell> ps -o pcpu -p 11300 %CPU 10.1 메모리사용률 Shell> ps -o vsz -p 11300 VSZ 8447864 디스크사용률 (ex. linux) Shell> df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 20641788 1625008 17968140 9% / none 8211648 3924128 4287520 48% /dev/shm /dev/sdb1 1663084532 1395923292 182681432 89% /home /dev/sdb2 1701178400 462146088 1152617476 29% /alti_data /dev/sda3 386418928 101322240 265467668 28% /alti_logs /dev/sda5 20641788 669688 18923460 4% /opt
145 / 166 OS CHECK LIST OS 시스템로그 시스템로그를통해 ALTIBASE 가 OS 에의해종료되었는지확인 운영제제 확인할시스템로그 SUN HP /var/adm/message 파일 /var/adm/syslog/syslog.log 파일 AIX errpt -a LINUX /var/log/message 파일
146 / 166 ALTIBASE ADVANCE MONITORING TOOL
147 / 166 MONITORING TOOL CONTENTS AMS(ALTIBASE MONITORING SYSTEM) SQUIRREL SQL CLIENT
148 / 166 MONITORING TOOL AMS(ALTIBASE MONITORING SYSTEM)
AMS(ALTIBASE MONITORING SYSTEM) 지원 OS 및 ALTIBASE 버전 구분지원지원가능 OS 종류 ALTIBASE 버전 Linux 계열 ( Ubuntu, CentOS, Redhat) Linux 계열외 ( HP, AIX, SUN ) A5 ( 5.3.5 버전이상 ) A6 A7 System Resource 모니터링가능 ALTIBASE 모니터링가능 System Resource 모니터링불가 ALTIBASE 모니터링원격가능 Shard Mornitoring 요청시추가가능 특징 Open Source 활용으로상용 S/W 에대한추가비용없음 50 여개의모니터링메트릭스제공으로용도별선별사용 데이터저장소로빠른시계열 (TIME SERIES) 데이터베이스활용으로모니터링대상데이터베이스부하경감 사용자가직접다양한 chart 및 dashboard 구성가능 다운로드 URL : https://github.com/bsshin71/ams 149 / 166
150 / 166 AMS(ALTIBASE MONITORING SYSTEM) AMS HOME DASHBOARD 예시화면 관심 chart 추가및변경가능 Layout 일부변경가능 ( Html 코드삽입 ) 여러대의데이터베이스 SERVER 추가가능
151 / 166 AMS(ALTIBASE MONITORING SYSTEM) AMS SYSTEM OVERVIEW DASHBOARD 전체예시화면
152 / 166 AMS(ALTIBASE MONITORING SYSTEM) AMS 이중화전체예시화면
153 / 166 MONITORING TOOL SQUIRREL SQL CLIENT
154 / 166 SQUIRREL SQL CLIENT 시스템요구사항 ALTIBASE : ALTIBASE 6 이상 SQUIRREL : 3.7.1 Standard 특징 ALTIBASE 에접속하여 SQUIRREL SQL CLIENT 를사용하기위한 plug-in 공식 plug-in 이아니기때문에별도로사용자가직접다운로드 설치방법 https://jaist.dl.sourceforge.net/project/squirrel-sql/1-stable/3.7.1/squirrel-sql-3.7.1 -standard.jar 에서 CLIENT 파일다운로드 Driver 등록후 (Altibase.jar) ALTIBASE 연동가능
155 / 166 SQUIRREL SQL CLIENT SQUIRREL OBJECT 화면
156 / 166 SQUIRREL SQL CLIENT SQUIRREL SQL 화면
157 / 166 ALTIBASE ADVANCE TECHNICAL SUPPORT
158 / 166 MONITORING TOOL CONTENTS ALTIBASE WIKIPEDIA ALTIBASE CUSTOMER SERVICE
159 / 166 TECHNICAL SUPPORT ALTIBASE WIKIPEDIA
ALTIBASE WIKIPEDIA AID SITE ALTIBASE 운영및개발관련정보제공 FAQ TECHNICAL DOCUMENTS URL : aid.altibase.com 160 / 166
161 / 166 TECHNICAL SUPPORT ALTIBASE CUSTOMER SERVICE
ALTIBASE CUSTOMER SERVICE ALTIBASE 는일관되고신속한기술지원제공. On-Line On-Call On-Remote On-Site Web Support Portal Service Desk CTI Service Desk 1. 기술지원포털 http://support.altibase.com 2. 등록된요청에대한엔지니어지정 3. 기술지원및이력관리 1. 기술지원콜센터 (02) 2082-1114 2. 요청에대한전화응대 3. 기술지원및지원이력관리 1. On-Line/On-Call 을통한요청접수 2. 원격지원을위한엔지니어지정 3. 원격지원을위한 URL 접속안내 http://rsup.net/altibase 4. 기술지원및지원이력관리 1. On-Line/On-Call 을통한요청접수 2. 엔지니어지정및현장방문 3. 기술지원및지원이력관리 다운로드서비스 제품 Release Notes Patch Notes Manual White Paper FAQ 제공 긴급상황을대비하여 7 X 24 유지 SID 를획득한고객만이용가능 긴급상황을대비하여 7 X 24 유지 웹브라우저를통하여엔지니어가고객의화면을함께보면서지원 SID 를획득한고객만이용가능 162 / 166
163 / 166 ALTIBASE CUSTOMER SERVICE ALTIBASE 는일관되고신속한기술지원제공 Customer Service Desk ALTIBASE Technical Division ALTIBASE R&D Web Portal 분석의뢰 담당개발부서 ALTIBASE 엔지니어 자체분석 전화지원 현장엔지니어요청, 이관 협업 / 공조 Bug? 자체 Feedback 가능부분처리 지사, 파트너엔지니어 Bug 등록및진행
164 / 166 ALTIBASE CUSTOMER SERVICE ALTIBASE 기술서비스요청방법 support.altibase.com 에서간단한회원가입 [ 고객서비스 ] -> [SID 등록 ] 에서회사명을검색후해당 SID 추가
165 / 166 ALTIBASE CUSTOMER SERVICE ALTIBASE 는일관되고신속한기술지원제공 [ 고객서비스 ] -> [ 기술지원요청 ] -> [ 기술지원요청등록 ] 을통하여기술지원요청