SlideShare a Scribd company logo
1 of 78
2016년 JavaCafe 강사준비팀4기
Keynote
DBMS 성능 높이기
개발자도 알아야 하는
Keynote
MariaDB 서버 구축하기
강사소개
MariaDB 서버 구축하기
■ 강사 프로필
이 름 : 이 정 해
주 사용 DB : DB2, MS-SQL,
MySQL,Oracle
■ 수행 프로젝트
삼성화재 상품, 배치 DB2 Database Server Migration 및 Version Upgrade
국민카드 보험통판 Database 신규 구축
현대중공업 PLM Database 구축
SK Telecom 시스템 고도화 프로젝트
아주캐피탈 차세대 시스템 구축
다크에덴 DB Upgrade 및 모니터링 시스템 구축 - 수행중
■ 주 관심사
인프라 기술
Cloud - Open Stack
SWIFT
MariaDB 서버 구축하기
차 례
MariaDB 서버 구축하기
1. DBMS의 Brain : Optimizer
2. 나의 데이터 저장소 : Tablespace,
Table
3. 조리있게 명령을 내리자 : SQL
3. 지름길 안내 : Index
4. LOB의 성능을 높이자 - Inline Lob
MariaDB 서버 구축하기
INTRO
MariaDB 서버 구축하기
■ 즐거운 여행
• 서울에서 부산을 가자!
1. 목표를 설정했습니다.
2. 네비게이션에 목표를 입력합니다.
3. 네비게이션이 목표를 찾습니다.
4. 이제 즐겁게 여행을 떠납시다. 고고고~!
5. 네비게이션은 실시간 정보를 받아 어디가 빠를지 계속 안내합
니다.
6. 목적지에 도착 후 즐겁게 여행을 즐깁니다.
7
MariaDB 서버 구축하기
select /*+ INDEX_DESC (tab1 idx01) */
A.Col1, B.Col2
from Table1 as tab1
Left Outer Join
Table2 as tab2
on tab1.col1 = tab2.col1
and tab1.col2 = tab1.col2
where 1=1
and tab1.col3 = 1
and tab2.col4 = ‘A’
order by col1 desc, col2 asc
MariaDB 서버 구축하기
■ 즐거운 여행
• 서울에서 부산을 가자!
1. 목표를 설정했습니다. - 사용자 SQL 입력
2. 네비게이션에 목표를 입력 하고 추천 목표지를 받습니다. -
Optimizer의 실행계획
3. 이제 즐겁게 여행을 떠납시다. - 테이블 데이터(여행정보)
4. 네비게이션은 실시간 정보를 받아 어디가 빠를지 계속 안내합
니다.
- Index
5. 목적지에 도착 후 즐겁게 여행을 즐깁니다.
- Table Data, LOB Data[추억쌓기, 사진, 음악등.]
9
MariaDB 서버 구축하기
DBMS의 핵심이자 두뇌!
Optimizer
MariaDB 서버 구축하기
■ Optimizer
• Optimizer란?
11
옵티마이저(Optimizer)는 SQL을
가장 빠르고 효율적으로 수행할
최적(최저비용)의 처리경로를 생
성해 주는 DBMS 내부의 핵심엔
진
MariaDB 서버 구축하기
■ Optimizer
• 방식의 정의 - CBO – Cost Based Optimizer
12
MariaDB 서버 구축하기
■ Optimizer
• Optimizer - 통계정보 및 실행계획
1. 인덱스 상태.
2. 데이터 분포.
3. Key 종류.
4. 테이블 참조제약.
5. 기타.
13
MariaDB 서버 구축하기
■ Optimizer
• Optimizer - 통계정보 및 실행계획
1. 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하
는 역할을 수행
14
MariaDB 서버 구축하기
■ Optimizer
• Optimizer - 통계정보 및 실행계획
MariaDB 서버 구축하기
■ Optimizer
• Optimizer - 통계정보 및 실행계획
MariaDB 서버 구축하기
■ Optimizer
• Optimizer - 통계정보 및 실행계획
MariaDB 서버 구축하기
■ Optimizer
• Optimizer - 통계정보 및 실행계획
MariaDB 서버 구축하기
■ Optimizer
• 쿼리 리라이트 – 최적의 여행코스를 짜보자.
19
서울
휴게소
우동, 짜장면등
중간 경유지
명소, ETC
고속도로 공사
중
우회길 탐색
다른 고속도로
국도
부산 도착
MariaDB 서버 구축하기
■ Optimizer
• 쿼리 리라이트 – 쿼리 재작성 및 재조합.
1. 사용자 조인을 조정.
2. 사용자 컬럼 캐스팅 조정.
3. 조인 순서 변경
4. 조인 값 추가
5. 기타 여러가지 재조정.
20
MariaDB 서버 구축하기
■ Optimizer
• 쿼리 리라이트 – 중요한 힌트!
1. 나의 SQL이 어떻게 바뀌었는
지 알 수 있다.
2. 흐름 과정을 이해할 수 있다.
3. SQL을 어떻게 작성할 것인지
에 대한 힌트를 얻을 수 있다.
4. 구간구간 병목 구간을 유추해
볼 수 있다.
5. 버그 유무를 알 수 있다.
21
MariaDB 서버 구축하기
■ Optimizer
• 쿼리 리라이트 - 쿼리 재작성 및 재조합.
MariaDB 서버 구축하기
■ Optimizer
• Optimizer Level - Optimizer Mode
1. 서울에서 부산으로 가는 방법
23
교통 수단에 따른 방법
KTX, 고속버스, 자가용
자가용을 사용시 경로에 따른 방법
서울 오른쪽 부산
서울 가운데 부산
서울 왼쪽 부산
MariaDB 서버 구축하기
■ Optimizer
• Optimizer Level – Optimizer Mode
1. 쿼리 복잡시 DBMS 기본 Optimizer 순위 혹은 상위 설정.
- RDBMS에 Optimizer 연산을 맡겨 빠른 경로를 찾게 함.
- SQL 쿼리 복잡도가 높다면 사람이 계산할 수 있는 한계가 있기 때문
에 옵티마이저가 최대의 연산을 할 수 있도록 도움. DBMS 자원의
상태를 보고 어떤 실행계획이 빠른지 모든 연산을 동원함.
24
MariaDB 서버 구축하기
■ Optimizer
• Optimizer Level – Optimizer Mode
2. 쿼리 단순시 옵티마이저 레발 혹은 모드를 낮춤.
- 단순 DML Query라면 옵티마이저 레벨을 낮추는게 유리.
- 누가봐도 이게 정답인 거라면 낮추는게 유리. 필요이상의 연산 방지.
25
MariaDB 서버 구축하기
■ Optimizer
• Optimizer Level – Optimizer Mode
3. 시스템 세션에서 바로 변경이 가능.
- 프로그램 개발시 단순 쿼리라면 현 세션 변수를 통해 Optimizer
Level을 낮추는게 가능.
- 레벨을 낮추어 쓸데없는 연산을 늘리지 말고 바로 수행할 수 있도록
컨트롤.
26
MariaDB 서버 구축하기
■ Optimizer
• Driving Table
27
- TABLE에 대한 JOIN시 먼저 ACCESS되서
ACCESS PATH를 주도하는TABLE
- 어느 TABLE이 먼저 ACCESS되느냐에 따라
속도의 차이가 크게 날 수 있으므로 매우
중요
27
MariaDB 서버 구축하기
■ Optimizer
• Driving Table
28
where 1=1
and 주민번호 = ‘998745-1265998’
and 휴대폰번호=‘010-1010-1010’
and 이메일주소=‘spring@spring.com’
where 1=1
and 성별 = ‘남’
and 병역필 = ‘필’
and 시군구 = ‘서울시’
MariaDB 서버 구축하기
■ Optimizer
• Cardinality - 유일성
1. 유일성
- 컬럼데이터 중 중복 값을 제거한 유일한 데이터 갯수
29
1
1
2
2
3
3
4
4
남
남
남
남
남
남
남
여
A
B
O
A
A
B
O
A
Cardinality : 4 Cardinality : 2 Cardinality : 3
MariaDB 서버 구축하기
나의 데이터 저장소
TableSpace, Table
MariaDB 서버 구축하기
■ Table Space
• Table Row의 크기 - Page Size Or Block Size
31
4K Row
Page size : 한 Row가 가질 수 있는 Row의 길이
8K Row
8K Row
16K Row
16K Row
32K Row
32K Row
MariaDB 서버 구축하기
■ Table Space
• Table Row의 크기 - Page Size Or Block Size
1. Oracle에는 Block Size라 표기하고 DB2와 기타 다른
RDBMS는 Page size라고 부름
2. OLTP : Online Transaction Processing
Oracle, MS-SQL, MySQL등
3. OLAP : Online Analytical Processing
DB2. Sybase등
32
MariaDB 서버 구축하기
■ Table Space
• Table Row의 크기 - Page Size Or Block Size
1. Page 크기에 따른 DB 용도
33
OLTP OLAP
MariaDB 서버 구축하기
■ Table
• 데이터 입력 성능을 높이기 위한 팁
1. 데이터 입력속도 높이기
- DBMS마다 데이터를 입력하는 명령어가 2가지 이상 방법 존재.
- 하나는 Import, 하나는 LOAD.
- 이 두가지 방법은 DBMS메카니즘으로 차이가 있음.
34
MariaDB 서버 구축하기
■ Table
• 데이터 입력 성능을 높이기 위한 팁
2. IMPORT
- 테이블의 모든 제약을 점검하면서 데이터를 입력.
- 테이블의 인덱스를 모두 체크하고 입력. - Primary, Unique Key등등.
- ROW By ROW로 입력하기 때문에 DBMS입장에서는 안전한 입력방법.
- Table이 깨질시에도 복구가 쉬움.
- 주로 몇십MB의 데이터 입력시 사용.
35
MariaDB 서버 구축하기
■ Table
• 데이터 입력 성능을 높이기 위한 팁
3. LOAD
- 일단 데이터의 입력 공간을 만들어 놓고 데이터를 밀어넣음.
- 후에 테이블의 인덱스를 체크. - Primary, Unique Key등등.
- 대량의 큰 데이터를 한번에 입력할때 사용. 혹은 데이터 초기 적재때 사용
.
- Table이 깨질 위험이 있으며 DBMS부하도 높음.
- 주로 몇GB이상 데이터 입력시 사용.
36
MariaDB 서버 구축하기
■ Table
• 데이터 입력 성능을 높이기 위한 팁
4. 데이터 입력 성능을 높이기 위한 방법
- 정렬(SORT) 메모리 크기를 늘림.
- Bulk Load를 위한 메모리 크기를 늘림.
- TEMP Space사이즈를 크게 늘려줌.
- 참조제약을 제거하고 입력. 입력 완료 후 다시 제약조건 설정
- 인덱스 DROP(삭제) 후 재생성.
- 아카이브 로그 작성 일시 OFF
- 빠른 속도를 가지고 있는 디스크로 교체
37
MariaDB 서버 구축하기
RDBMS를 컨트롤하는
단 하나의 언어
SQL
MariaDB 서버 구축하기
■ SQL
• Structured Query Language
1.데이터베이스에 접근할 수 있는 데이터베이스 하부 언어. 구조
화 질의어.
2.간단히 데이터 베이스에서 데이터를 읽어올때 DBMS에 명령을
내릴 수 있는 언어.
39
MariaDB 서버 구축하기
■ SQL
• Database를 제어하는 언어
40
DDL
Create
Drop
Alter
DML
Insert
Update
Delete
DCL
Commit
Rollback
Transaction
MariaDB 서버 구축하기
■ SQL
• 성격 맞추기
41
C1 C2 C3 C4
Int Char Varchar Date
WEHRE C1=‘1234’
AND C2 = 1
AND C3 = ‘C’
AND C4 = ‘2015-05-06’
MariaDB 서버 구축하기
■ SQL
• Char vs Varchar
1. Char - size 4byte
42
필 립 스 ’’
삼 성 ’’ ‘'
파 나 소 닉
아 이 와 ’’
MariaDB 서버 구축하기
■ SQL
• Char vs Varchar
1. Varchar(10)
43
아 메 리 카 노
카 라 멜 마 키 아 토
프 라 푸 치 노
밀 크 쉐 이 크
MariaDB 서버 구축하기
■ SQL
• Date VS Varchar
44
Date Column
Varchar Column
MariaDB 서버 구축하기
■ SQL
• Date VS Varchar
45
DATE 컬럼을 쓴 데이터 조회 : 속도 빠름
SELECT ...
FROM ...
WHERE 기준일자 BETWEEN to_date('20091020', 'yyyymmdd') an
to_date('20091021', ‘yyyymmdd)
Varchar 컬럼을 쓴 데이터 조회 : 데이터 품질 저하
SELECT ...
FROM ...
WHERE 기준일자 BETWEEN '20091020' and '20091021'
MariaDB 서버 구축하기
■ SQL
• 정수형 - Integer
46
INT BIGINT
4 Byte 8 Byte
- 일반적으로 Integer뒤에 나오는 숫자는 표현 자리수를 의미
- 화면상에 나타날 소숫점 자리 혹은 정수자리의 자릴수를 표시
- NUM INT(10) - 10자리 미만은 0으로 채우겠다는 의미.
Insert Into T1 values(12345) = 0000012345
- 벤더사마다 의미가 틀릴 수 있음.
MariaDB 서버 구축하기
■ SQL
• Group by vs Distinct
47
MariaDB 서버 구축하기
■ SQL
• Group by vs Distinct
48
공통의 목적 : 중복 제거
정렬의 목적 : Distinct -> 중복만 제거 정렬안됨.
Group by -> 중복제거 후 정렬된 값 도출.
속도비교 : Group by가 오라클에서는 더 빠르다고 함.
타벤더는 데이터 구성이나 방식에 따라 차이가 좀
있을 수도 있음.
결과의 목적 : Group by는 Having Count를 쓸 수 있음.
MariaDB 서버 구축하기
■ SQL
• 성능을 높이기 위한 팁
1. 사용자제할 Function.
- DECODE - CPU Overhead 발생. 최대한 Case문으로 변경할것.
- Or문 : Full Table Scan 가능성 높아짐. Union All 혹은 In, Exist를 사
용해서 OR 문 제거할것.
- Distinct : 정렬작업을 수반함. 불필요한 Distinct사용남발 자제
49
MariaDB 서버 구축하기
■ SQL
• 성능을 높이기 위한 팁
2. 인덱스 사용.
- 부정형보다 긍정형 조건을 사용. [예 ) <> 대신에 AND ]
- 가능한 PK Index 사용할것.
- 명확환 Where조건 사용. 인위적 변경은 인덱스를 타지 못하게 한다.
50
MariaDB 서버 구축하기
■ SQL
• 성능을 높이기 위한 팁
2. 인덱스 사용.
51
CREATE TABLE T1 (RDATE DATETIME);
CREATE INDEX IDX_RDATE ON T1(RDATE);
INSERT INTO T1 VALUES NOW();
SELECT * FROM T1 WHERE RDATE = SUBSTR(RDATE,1,8)
위의 SQL은 인덱스를 탈까요 안탈까요?
만약에 인덱스를 탄다면 정상일까요? 비정상일까요?
MariaDB 서버 구축하기
■ SQL
• 성능을 높이기 위한 팁
3. Data Type 일치
- Data Type이 일치하도록 한다.
- Data Type이 일치하지 않으면 Casting 연산이 추가로 들어가게 된다. 추
가 연산이 들어간다는 것은 추가적인 부하(OverHead)가 들어간다는 얘
기가 된다.
52
MariaDB 서버 구축하기
■ SQL
• ANSI SQL
1. ANSI SQL의 정의
- 최초의 SQL-86표준과 관계형 DBMS의 폭발적인 정성기를 주도했
던 ANSI/ISO SQL2(이하 SQL2) 세대를 지나면서 많은 기술적인 발
전
- SQL2의 경우 표준 SQL에 대한 명세가 부족한 부분이 있었고,
DBMS벤더 별로 문법이나 사용되는 용어의 차이가 너무 커져서 상
호 호환성이나 SQL학습 효율이 많이 부족한 문제가 발생
- 이에 향후 SQL에서 필요한 기능을 정리하고 호환 가능한 여러 기
준을 제정한 것이 1999년에 정해진 ANSI/SQL3(이하 SQL3)이다.
이후 가장 먼저 SQL3의 기능을 시현한 것이 Oracle 8i/9i 버전이라
할 수 있다. (현재 오라클 사의 공인 SQL교육은 ANSI 표준 SQL로
실시)
- 이 후 2003년 ANSI/ISO SQL기준이 소폭 추가 개정되었고, 현재 사
용되는 데이터베이스는 대부분 SQL-2003표준을 기준으로 하고 있
다.
53
MariaDB 서버 구축하기
■ SQL
• ANSI SQL
54
SELECT t1.c1, t2.c1
FROM table t1, table t2
WHERE t1.c1 = t2.c1(+)
AND t1.c2 = ‘ResNo’
AND t2.c2 = ‘TelNo’
어떤것이 Left Outer Join일까요???
그리고 어떤것이 Right Outer Join일까요??
SELECT t1.c1, t2.c1
FROM table t1, table t2
WHERE t1.c1(+) = t2.c1
AND t1.c2 = ‘ResNo’
AND t2.c2 = ‘TelNo’
MariaDB 서버 구축하기
■ SQL
• ANSI SQL
55
SELECT t1.c1, t2.c1
FROM table t1 LEFT OUTER JOIN table t2
ON t1.c1 = t2.c1
WHERE t1.c2 = ‘ResNo’
AND t2.c2 = ‘TelNo’
왼쪽이 Left Outer Join
오른쪽이 Right Outer Join 입니다.
SELECT t1.c1, t2.c1
FROM table t1 RIGHT OUTER JOIN table t2
ON t1.c1 = t2.c1
WHERE t1.c2 = ‘ResNo’
AND t2.c2 = ‘TelNo’
MariaDB 서버 구축하기
DBMS의 고속도로
Index
MariaDB 서버 구축하기
■ Index
• Index란
1. 간단히 정의
- 각 테이블들의 Row에 색인 달기
2. 고급지게 정의.
- 테이블에 저장된 데이터를 빠르게 조회하기 위한 데이터베이스 객
체
- B-Tree구조를 가짐(B-Tree Index의 경우)
- Index는 논리적/물리적으로 테이블과 독립적임
57
MariaDB 서버 구축하기
■ Index
• Index의 구조 – 이론.
58
MariaDB 서버 구축하기
■ Index
• Index와 Data의 분리
1. Data Table Space와 Index Table Space를 분리.
- 대부분의 RDBMS는 테이블을 정의할때 Data저장장소와 Index저
장장소를 명시해서 만든다.
- Index의 저장장소를 명시하지 않으면 Data저장 장소를 Index의 저
장 장소로 같이 쓰인다.
59
MariaDB 서버 구축하기
■ Index
• Primary Index
1. 프리머리 인덱스란?
- 테이블 내의 복수개의 tuple들 중 해당 키 값을 가지고 있는 tuple
은 오직 하나임을 나타내준다.
2. 간단히 테이블안의 특정 컬럼에는 어떤한 값도 중복되지 않
고 존재한다. 즉 유일하다.
60
MariaDB 서버 구축하기
■ Index
• Primary Index
1. Primary Key 생성법
61
CREATE TABLE Person(
SEQ INT AUTO_INCREMENT,
주민번호 CHAR(14),
이름 VARCHAR(15),
이메일 VARCHAR(40),
전화번호 CHAR(13)
CONSTRAINT pk_key PRIMARY KEY (SEQ))
ALTER TABLE Persons
ADD CONSTRAINT pk_seq PRIMARY KEY (SEQ)
MariaDB 서버 구축하기
■ Index
• Primary Index
2. Primary Key 사용 이유
- 데이터의 중복값을 허용하지 않음. - 제일 빠른 검색의 조건
- Primary Key 생성시 Primary Index 자동생성.
이로 인해 데이터 검색 속도 향상
- 테이블 관계조건을 맺는 용도로 사용.
- 데이터 통합 및 역공학시 기준점으로 사용되어 작업이 편리해짐.
62
MariaDB 서버 구축하기
■ Index
• Clustering Index - 정의
1. 테이블에 데이터가 Key 배열에 순서적으로 입력되어 있음.
2. SQL에서 WHERE조건을 검색할 때 클러스터링 인덱스를 최
우선으로 두고 검색을 시작함. 즉 우선순위가 높음.
3. 대용량 처리시 일반 인덱스보다 2배정도 처리 성능이 우월
함.
63
MariaDB 서버 구축하기
■ Index
• Clustering Index - 모습
64
MariaDB 서버 구축하기
■ Index
• Clustering Index
1. 생성방법
65
CREATE INDEX idx_seq_cluster ON
Person(SEQ) CLUSTER;
MariaDB 서버 구축하기
■ Index
• UNIQUE Index
1. Unique Index 의 특징.
- Primary Key와 마찬가지로 데이터 중복을 허용하지 않는 인덱스.
- Primary Key와의 차이는 Null값도 데이터로 보기 때문에 허용하는
것의 차이.
- 여러개 생성이 가능함.
- 그러나 분명한 차이가 있기 때문에 따로 만들어 둔것.
- Primary Key와 Unique Index 의 차이를 반드시 이해할 것.
66
MariaDB 서버 구축하기
■ Index
• Unique Key
1. 생성방법
67
CREATE UNIQUE INDEX idx_seq ON Person (SEQ)
CREATE UNIQUE INDEX idx_주민번호 ON Person (주
민번호)
MariaDB 서버 구축하기
■ Index
• Index의 Include 옵션
1. Create index 의 Include 용도
- Covering index로 사용.
- SQL의 WHERE 조건에서 평소에는 잘 사용하지 않으나 어쩌다 필
요에 의해서 사용되는 컬럼에 사용.
68
MariaDB 서버 구축하기
■ Index
• Index의 Include 옵션
1. 이론
- 일반적으로 복합인덱스 생성시 평소 잘 사용하지 않는 컬럼까지 복
합 인덱스로 생성시 필요이상의 인덱스 깊이가 생기게 됨.
- 이로 인해 인덱스의 깊이가 깊어지게 되고 그에 따른 추가적인 디
스크 용량이 더 필요하게 됨.
69
MariaDB 서버 구축하기
■ Index
• Index의 Include 옵션
1. 이론
- 평소 잘 사용되지 않는 컬럼을 Include옵션으로 빼두고 만약 필요
할시 이용함.
- 이렇게 해두면 인덱스 깊이는 크게 늘어나지 않고 인덱스 크기도
크게 되지 않게 되어 디스크 용량도 줄어들게 됨.
70
MariaDB 서버 구축하기
■ Index
• Index 유지보수
1. 한테이블당 인덱스 갯수
- 가능하면 5개 미만으로 유지.
2. 중복되는 인덱스를 여러개 만들지 말것.
- SEQ, 주민번호 - 인덱스 1번
- SEQ, 주민번호, 이메일 - 인덱스 2번
71
MariaDB 서버 구축하기
■ Index
• Index 유지보수
3. 마스터 테이블은 Clustering Index로 만들것.
- 클러스터링 비율이 1 이하이면 다시 생성.
4. 정기적으로 Table index 재생성.
- 테이블에 DML이 많이 일어나면 테이블 인덱스 효율이 떨어짐.
- 인덱스 재생성 만으로 2-10% 사이의 성능 향상을 기대해볼 수 있음
.
72
MariaDB 서버 구축하기
나의 전용 방
LOB
MariaDB 서버 구축하기
■ LOB
• LOB 컬럼의 정의.
1. 일반적으로 테이블 생성시 큰 사이즈의 컬럼 저장장소를 따
로 생성.
2. CHAR, VARCHAR, BIGINT에서 만들 수 있는 허용범위를
벗어난 경우 이곳에 저장.
74
MariaDB 서버 구축하기
■ LOB
• LOB 컬럼의 운용 - 일반적인 LOB방식
75
Bufferpool
Normal
Tablespace
LOB
Tablespace
Database
MariaDB 서버 구축하기
■ LOB
• LOB 컬럼의 운용 - 일반적인 LOB방식
76
Normal
Tablespace
LOB
Tablespace
Database
Bufferpool
MariaDB 서버 구축하기
■ LOB
• Inline LOB 컬럼의 문제점.
1. 메모리 낭비가 심할 수 있음.
2. Prefetcher와 IO CLEAN이 자주 일어날 수 있음.
3. 자주 사용되는 ROW가 우선순위에서 밀려날 수 있음.
4. 보통 4000Byte정도에서 사용할것을 권고합니다.
77
MariaDB 서버 구축하기
궁금한점은질문해주세요
강의가 끝났습니다
Keynote

More Related Content

What's hot

Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architectureJongwon Kim
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3Heungsub Lee
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
MariaDB MaxScale
MariaDB MaxScaleMariaDB MaxScale
MariaDB MaxScaleMariaDB plc
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조Hyunjik Bae
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바NeoClova
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규ChangKyu Song
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기NAVER D2
 
M|18 Architectural Overview: MariaDB MaxScale
M|18 Architectural Overview: MariaDB MaxScaleM|18 Architectural Overview: MariaDB MaxScale
M|18 Architectural Overview: MariaDB MaxScaleMariaDB plc
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸NAVER D2
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話Yoshinori Matsunobu
 

What's hot (20)

Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
MariaDB MaxScale
MariaDB MaxScaleMariaDB MaxScale
MariaDB MaxScale
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바MySQL Administrator 2021 - 네오클로바
MySQL Administrator 2021 - 네오클로바
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
 
[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기[261] 실시간 추천엔진 머신한대에 구겨넣기
[261] 실시간 추천엔진 머신한대에 구겨넣기
 
M|18 Architectural Overview: MariaDB MaxScale
M|18 Architectural Overview: MariaDB MaxScaleM|18 Architectural Overview: MariaDB MaxScale
M|18 Architectural Overview: MariaDB MaxScale
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 

Similar to 개발자도 알아야 하는 DBMS튜닝

개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축정해 이
 
MariaDB Administrator 교육
MariaDB Administrator 교육 MariaDB Administrator 교육
MariaDB Administrator 교육 Sangmo Kim
 
From MSSQL to MariaDB
From MSSQL to MariaDBFrom MSSQL to MariaDB
From MSSQL to MariaDBI Goo Lee
 
Maria db
Maria dbMaria db
Maria dbymtech
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바NeoClova
 
MariaDB
MariaDBMariaDB
MariaDBymtech
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxNeoClova
 
CDNetowks MariaDB 5.5 Upgrade Case Study
CDNetowks MariaDB 5.5 Upgrade Case StudyCDNetowks MariaDB 5.5 Upgrade Case Study
CDNetowks MariaDB 5.5 Upgrade Case StudySoo Hyun Park
 
MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)OracleMySQL
 
Database 튜닝 교육 110124
Database 튜닝 교육 110124Database 튜닝 교육 110124
Database 튜닝 교육 110124한 경만
 
No sql & data modelling
No sql & data modellingNo sql & data modelling
No sql & data modellingJae Hong Park
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)I Goo Lee
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개NeoClova
 
Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQLrockplace
 
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴Devgear
 
MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개rockplace
 
MariaDB Other Features
MariaDB Other FeaturesMariaDB Other Features
MariaDB Other FeaturesJongJin Lee
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례if kakao
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL TuningPgDay.Seoul
 

Similar to 개발자도 알아야 하는 DBMS튜닝 (20)

개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축개발자가 도전하는 MariaDB 서버구축
개발자가 도전하는 MariaDB 서버구축
 
MariaDB Administrator 교육
MariaDB Administrator 교육 MariaDB Administrator 교육
MariaDB Administrator 교육
 
From MSSQL to MariaDB
From MSSQL to MariaDBFrom MSSQL to MariaDB
From MSSQL to MariaDB
 
Maria db
Maria dbMaria db
Maria db
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바
 
MariaDB
MariaDBMariaDB
MariaDB
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docx
 
CDNetowks MariaDB 5.5 Upgrade Case Study
CDNetowks MariaDB 5.5 Upgrade Case StudyCDNetowks MariaDB 5.5 Upgrade Case Study
CDNetowks MariaDB 5.5 Upgrade Case Study
 
MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)
 
Database 튜닝 교육 110124
Database 튜닝 교육 110124Database 튜닝 교육 110124
Database 튜닝 교육 110124
 
No sql & data modelling
No sql & data modellingNo sql & data modelling
No sql & data modelling
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개
 
Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQL
 
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
보다 빠른 SQL튜닝과 분석을 위한 새로운 툴
 
MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개
 
MariaDB Other Features
MariaDB Other FeaturesMariaDB Other Features
MariaDB Other Features
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
 
dbt 101
dbt 101dbt 101
dbt 101
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
 

개발자도 알아야 하는 DBMS튜닝

  • 1. 2016년 JavaCafe 강사준비팀4기 Keynote DBMS 성능 높이기 개발자도 알아야 하는 Keynote
  • 3. MariaDB 서버 구축하기 ■ 강사 프로필 이 름 : 이 정 해 주 사용 DB : DB2, MS-SQL, MySQL,Oracle ■ 수행 프로젝트 삼성화재 상품, 배치 DB2 Database Server Migration 및 Version Upgrade 국민카드 보험통판 Database 신규 구축 현대중공업 PLM Database 구축 SK Telecom 시스템 고도화 프로젝트 아주캐피탈 차세대 시스템 구축 다크에덴 DB Upgrade 및 모니터링 시스템 구축 - 수행중 ■ 주 관심사 인프라 기술 Cloud - Open Stack SWIFT
  • 5. MariaDB 서버 구축하기 1. DBMS의 Brain : Optimizer 2. 나의 데이터 저장소 : Tablespace, Table 3. 조리있게 명령을 내리자 : SQL 3. 지름길 안내 : Index 4. LOB의 성능을 높이자 - Inline Lob
  • 7. MariaDB 서버 구축하기 ■ 즐거운 여행 • 서울에서 부산을 가자! 1. 목표를 설정했습니다. 2. 네비게이션에 목표를 입력합니다. 3. 네비게이션이 목표를 찾습니다. 4. 이제 즐겁게 여행을 떠납시다. 고고고~! 5. 네비게이션은 실시간 정보를 받아 어디가 빠를지 계속 안내합 니다. 6. 목적지에 도착 후 즐겁게 여행을 즐깁니다. 7
  • 8. MariaDB 서버 구축하기 select /*+ INDEX_DESC (tab1 idx01) */ A.Col1, B.Col2 from Table1 as tab1 Left Outer Join Table2 as tab2 on tab1.col1 = tab2.col1 and tab1.col2 = tab1.col2 where 1=1 and tab1.col3 = 1 and tab2.col4 = ‘A’ order by col1 desc, col2 asc
  • 9. MariaDB 서버 구축하기 ■ 즐거운 여행 • 서울에서 부산을 가자! 1. 목표를 설정했습니다. - 사용자 SQL 입력 2. 네비게이션에 목표를 입력 하고 추천 목표지를 받습니다. - Optimizer의 실행계획 3. 이제 즐겁게 여행을 떠납시다. - 테이블 데이터(여행정보) 4. 네비게이션은 실시간 정보를 받아 어디가 빠를지 계속 안내합 니다. - Index 5. 목적지에 도착 후 즐겁게 여행을 즐깁니다. - Table Data, LOB Data[추억쌓기, 사진, 음악등.] 9
  • 10. MariaDB 서버 구축하기 DBMS의 핵심이자 두뇌! Optimizer
  • 11. MariaDB 서버 구축하기 ■ Optimizer • Optimizer란? 11 옵티마이저(Optimizer)는 SQL을 가장 빠르고 효율적으로 수행할 최적(최저비용)의 처리경로를 생 성해 주는 DBMS 내부의 핵심엔 진
  • 12. MariaDB 서버 구축하기 ■ Optimizer • 방식의 정의 - CBO – Cost Based Optimizer 12
  • 13. MariaDB 서버 구축하기 ■ Optimizer • Optimizer - 통계정보 및 실행계획 1. 인덱스 상태. 2. 데이터 분포. 3. Key 종류. 4. 테이블 참조제약. 5. 기타. 13
  • 14. MariaDB 서버 구축하기 ■ Optimizer • Optimizer - 통계정보 및 실행계획 1. 사용자가 질의한 SQL문에 대해 최적의 실행 방법을 결정하 는 역할을 수행 14
  • 15. MariaDB 서버 구축하기 ■ Optimizer • Optimizer - 통계정보 및 실행계획
  • 16. MariaDB 서버 구축하기 ■ Optimizer • Optimizer - 통계정보 및 실행계획
  • 17. MariaDB 서버 구축하기 ■ Optimizer • Optimizer - 통계정보 및 실행계획
  • 18. MariaDB 서버 구축하기 ■ Optimizer • Optimizer - 통계정보 및 실행계획
  • 19. MariaDB 서버 구축하기 ■ Optimizer • 쿼리 리라이트 – 최적의 여행코스를 짜보자. 19 서울 휴게소 우동, 짜장면등 중간 경유지 명소, ETC 고속도로 공사 중 우회길 탐색 다른 고속도로 국도 부산 도착
  • 20. MariaDB 서버 구축하기 ■ Optimizer • 쿼리 리라이트 – 쿼리 재작성 및 재조합. 1. 사용자 조인을 조정. 2. 사용자 컬럼 캐스팅 조정. 3. 조인 순서 변경 4. 조인 값 추가 5. 기타 여러가지 재조정. 20
  • 21. MariaDB 서버 구축하기 ■ Optimizer • 쿼리 리라이트 – 중요한 힌트! 1. 나의 SQL이 어떻게 바뀌었는 지 알 수 있다. 2. 흐름 과정을 이해할 수 있다. 3. SQL을 어떻게 작성할 것인지 에 대한 힌트를 얻을 수 있다. 4. 구간구간 병목 구간을 유추해 볼 수 있다. 5. 버그 유무를 알 수 있다. 21
  • 22. MariaDB 서버 구축하기 ■ Optimizer • 쿼리 리라이트 - 쿼리 재작성 및 재조합.
  • 23. MariaDB 서버 구축하기 ■ Optimizer • Optimizer Level - Optimizer Mode 1. 서울에서 부산으로 가는 방법 23 교통 수단에 따른 방법 KTX, 고속버스, 자가용 자가용을 사용시 경로에 따른 방법 서울 오른쪽 부산 서울 가운데 부산 서울 왼쪽 부산
  • 24. MariaDB 서버 구축하기 ■ Optimizer • Optimizer Level – Optimizer Mode 1. 쿼리 복잡시 DBMS 기본 Optimizer 순위 혹은 상위 설정. - RDBMS에 Optimizer 연산을 맡겨 빠른 경로를 찾게 함. - SQL 쿼리 복잡도가 높다면 사람이 계산할 수 있는 한계가 있기 때문 에 옵티마이저가 최대의 연산을 할 수 있도록 도움. DBMS 자원의 상태를 보고 어떤 실행계획이 빠른지 모든 연산을 동원함. 24
  • 25. MariaDB 서버 구축하기 ■ Optimizer • Optimizer Level – Optimizer Mode 2. 쿼리 단순시 옵티마이저 레발 혹은 모드를 낮춤. - 단순 DML Query라면 옵티마이저 레벨을 낮추는게 유리. - 누가봐도 이게 정답인 거라면 낮추는게 유리. 필요이상의 연산 방지. 25
  • 26. MariaDB 서버 구축하기 ■ Optimizer • Optimizer Level – Optimizer Mode 3. 시스템 세션에서 바로 변경이 가능. - 프로그램 개발시 단순 쿼리라면 현 세션 변수를 통해 Optimizer Level을 낮추는게 가능. - 레벨을 낮추어 쓸데없는 연산을 늘리지 말고 바로 수행할 수 있도록 컨트롤. 26
  • 27. MariaDB 서버 구축하기 ■ Optimizer • Driving Table 27 - TABLE에 대한 JOIN시 먼저 ACCESS되서 ACCESS PATH를 주도하는TABLE - 어느 TABLE이 먼저 ACCESS되느냐에 따라 속도의 차이가 크게 날 수 있으므로 매우 중요 27
  • 28. MariaDB 서버 구축하기 ■ Optimizer • Driving Table 28 where 1=1 and 주민번호 = ‘998745-1265998’ and 휴대폰번호=‘010-1010-1010’ and 이메일주소=‘spring@spring.com’ where 1=1 and 성별 = ‘남’ and 병역필 = ‘필’ and 시군구 = ‘서울시’
  • 29. MariaDB 서버 구축하기 ■ Optimizer • Cardinality - 유일성 1. 유일성 - 컬럼데이터 중 중복 값을 제거한 유일한 데이터 갯수 29 1 1 2 2 3 3 4 4 남 남 남 남 남 남 남 여 A B O A A B O A Cardinality : 4 Cardinality : 2 Cardinality : 3
  • 30. MariaDB 서버 구축하기 나의 데이터 저장소 TableSpace, Table
  • 31. MariaDB 서버 구축하기 ■ Table Space • Table Row의 크기 - Page Size Or Block Size 31 4K Row Page size : 한 Row가 가질 수 있는 Row의 길이 8K Row 8K Row 16K Row 16K Row 32K Row 32K Row
  • 32. MariaDB 서버 구축하기 ■ Table Space • Table Row의 크기 - Page Size Or Block Size 1. Oracle에는 Block Size라 표기하고 DB2와 기타 다른 RDBMS는 Page size라고 부름 2. OLTP : Online Transaction Processing Oracle, MS-SQL, MySQL등 3. OLAP : Online Analytical Processing DB2. Sybase등 32
  • 33. MariaDB 서버 구축하기 ■ Table Space • Table Row의 크기 - Page Size Or Block Size 1. Page 크기에 따른 DB 용도 33 OLTP OLAP
  • 34. MariaDB 서버 구축하기 ■ Table • 데이터 입력 성능을 높이기 위한 팁 1. 데이터 입력속도 높이기 - DBMS마다 데이터를 입력하는 명령어가 2가지 이상 방법 존재. - 하나는 Import, 하나는 LOAD. - 이 두가지 방법은 DBMS메카니즘으로 차이가 있음. 34
  • 35. MariaDB 서버 구축하기 ■ Table • 데이터 입력 성능을 높이기 위한 팁 2. IMPORT - 테이블의 모든 제약을 점검하면서 데이터를 입력. - 테이블의 인덱스를 모두 체크하고 입력. - Primary, Unique Key등등. - ROW By ROW로 입력하기 때문에 DBMS입장에서는 안전한 입력방법. - Table이 깨질시에도 복구가 쉬움. - 주로 몇십MB의 데이터 입력시 사용. 35
  • 36. MariaDB 서버 구축하기 ■ Table • 데이터 입력 성능을 높이기 위한 팁 3. LOAD - 일단 데이터의 입력 공간을 만들어 놓고 데이터를 밀어넣음. - 후에 테이블의 인덱스를 체크. - Primary, Unique Key등등. - 대량의 큰 데이터를 한번에 입력할때 사용. 혹은 데이터 초기 적재때 사용 . - Table이 깨질 위험이 있으며 DBMS부하도 높음. - 주로 몇GB이상 데이터 입력시 사용. 36
  • 37. MariaDB 서버 구축하기 ■ Table • 데이터 입력 성능을 높이기 위한 팁 4. 데이터 입력 성능을 높이기 위한 방법 - 정렬(SORT) 메모리 크기를 늘림. - Bulk Load를 위한 메모리 크기를 늘림. - TEMP Space사이즈를 크게 늘려줌. - 참조제약을 제거하고 입력. 입력 완료 후 다시 제약조건 설정 - 인덱스 DROP(삭제) 후 재생성. - 아카이브 로그 작성 일시 OFF - 빠른 속도를 가지고 있는 디스크로 교체 37
  • 38. MariaDB 서버 구축하기 RDBMS를 컨트롤하는 단 하나의 언어 SQL
  • 39. MariaDB 서버 구축하기 ■ SQL • Structured Query Language 1.데이터베이스에 접근할 수 있는 데이터베이스 하부 언어. 구조 화 질의어. 2.간단히 데이터 베이스에서 데이터를 읽어올때 DBMS에 명령을 내릴 수 있는 언어. 39
  • 40. MariaDB 서버 구축하기 ■ SQL • Database를 제어하는 언어 40 DDL Create Drop Alter DML Insert Update Delete DCL Commit Rollback Transaction
  • 41. MariaDB 서버 구축하기 ■ SQL • 성격 맞추기 41 C1 C2 C3 C4 Int Char Varchar Date WEHRE C1=‘1234’ AND C2 = 1 AND C3 = ‘C’ AND C4 = ‘2015-05-06’
  • 42. MariaDB 서버 구축하기 ■ SQL • Char vs Varchar 1. Char - size 4byte 42 필 립 스 ’’ 삼 성 ’’ ‘' 파 나 소 닉 아 이 와 ’’
  • 43. MariaDB 서버 구축하기 ■ SQL • Char vs Varchar 1. Varchar(10) 43 아 메 리 카 노 카 라 멜 마 키 아 토 프 라 푸 치 노 밀 크 쉐 이 크
  • 44. MariaDB 서버 구축하기 ■ SQL • Date VS Varchar 44 Date Column Varchar Column
  • 45. MariaDB 서버 구축하기 ■ SQL • Date VS Varchar 45 DATE 컬럼을 쓴 데이터 조회 : 속도 빠름 SELECT ... FROM ... WHERE 기준일자 BETWEEN to_date('20091020', 'yyyymmdd') an to_date('20091021', ‘yyyymmdd) Varchar 컬럼을 쓴 데이터 조회 : 데이터 품질 저하 SELECT ... FROM ... WHERE 기준일자 BETWEEN '20091020' and '20091021'
  • 46. MariaDB 서버 구축하기 ■ SQL • 정수형 - Integer 46 INT BIGINT 4 Byte 8 Byte - 일반적으로 Integer뒤에 나오는 숫자는 표현 자리수를 의미 - 화면상에 나타날 소숫점 자리 혹은 정수자리의 자릴수를 표시 - NUM INT(10) - 10자리 미만은 0으로 채우겠다는 의미. Insert Into T1 values(12345) = 0000012345 - 벤더사마다 의미가 틀릴 수 있음.
  • 47. MariaDB 서버 구축하기 ■ SQL • Group by vs Distinct 47
  • 48. MariaDB 서버 구축하기 ■ SQL • Group by vs Distinct 48 공통의 목적 : 중복 제거 정렬의 목적 : Distinct -> 중복만 제거 정렬안됨. Group by -> 중복제거 후 정렬된 값 도출. 속도비교 : Group by가 오라클에서는 더 빠르다고 함. 타벤더는 데이터 구성이나 방식에 따라 차이가 좀 있을 수도 있음. 결과의 목적 : Group by는 Having Count를 쓸 수 있음.
  • 49. MariaDB 서버 구축하기 ■ SQL • 성능을 높이기 위한 팁 1. 사용자제할 Function. - DECODE - CPU Overhead 발생. 최대한 Case문으로 변경할것. - Or문 : Full Table Scan 가능성 높아짐. Union All 혹은 In, Exist를 사 용해서 OR 문 제거할것. - Distinct : 정렬작업을 수반함. 불필요한 Distinct사용남발 자제 49
  • 50. MariaDB 서버 구축하기 ■ SQL • 성능을 높이기 위한 팁 2. 인덱스 사용. - 부정형보다 긍정형 조건을 사용. [예 ) <> 대신에 AND ] - 가능한 PK Index 사용할것. - 명확환 Where조건 사용. 인위적 변경은 인덱스를 타지 못하게 한다. 50
  • 51. MariaDB 서버 구축하기 ■ SQL • 성능을 높이기 위한 팁 2. 인덱스 사용. 51 CREATE TABLE T1 (RDATE DATETIME); CREATE INDEX IDX_RDATE ON T1(RDATE); INSERT INTO T1 VALUES NOW(); SELECT * FROM T1 WHERE RDATE = SUBSTR(RDATE,1,8) 위의 SQL은 인덱스를 탈까요 안탈까요? 만약에 인덱스를 탄다면 정상일까요? 비정상일까요?
  • 52. MariaDB 서버 구축하기 ■ SQL • 성능을 높이기 위한 팁 3. Data Type 일치 - Data Type이 일치하도록 한다. - Data Type이 일치하지 않으면 Casting 연산이 추가로 들어가게 된다. 추 가 연산이 들어간다는 것은 추가적인 부하(OverHead)가 들어간다는 얘 기가 된다. 52
  • 53. MariaDB 서버 구축하기 ■ SQL • ANSI SQL 1. ANSI SQL의 정의 - 최초의 SQL-86표준과 관계형 DBMS의 폭발적인 정성기를 주도했 던 ANSI/ISO SQL2(이하 SQL2) 세대를 지나면서 많은 기술적인 발 전 - SQL2의 경우 표준 SQL에 대한 명세가 부족한 부분이 있었고, DBMS벤더 별로 문법이나 사용되는 용어의 차이가 너무 커져서 상 호 호환성이나 SQL학습 효율이 많이 부족한 문제가 발생 - 이에 향후 SQL에서 필요한 기능을 정리하고 호환 가능한 여러 기 준을 제정한 것이 1999년에 정해진 ANSI/SQL3(이하 SQL3)이다. 이후 가장 먼저 SQL3의 기능을 시현한 것이 Oracle 8i/9i 버전이라 할 수 있다. (현재 오라클 사의 공인 SQL교육은 ANSI 표준 SQL로 실시) - 이 후 2003년 ANSI/ISO SQL기준이 소폭 추가 개정되었고, 현재 사 용되는 데이터베이스는 대부분 SQL-2003표준을 기준으로 하고 있 다. 53
  • 54. MariaDB 서버 구축하기 ■ SQL • ANSI SQL 54 SELECT t1.c1, t2.c1 FROM table t1, table t2 WHERE t1.c1 = t2.c1(+) AND t1.c2 = ‘ResNo’ AND t2.c2 = ‘TelNo’ 어떤것이 Left Outer Join일까요??? 그리고 어떤것이 Right Outer Join일까요?? SELECT t1.c1, t2.c1 FROM table t1, table t2 WHERE t1.c1(+) = t2.c1 AND t1.c2 = ‘ResNo’ AND t2.c2 = ‘TelNo’
  • 55. MariaDB 서버 구축하기 ■ SQL • ANSI SQL 55 SELECT t1.c1, t2.c1 FROM table t1 LEFT OUTER JOIN table t2 ON t1.c1 = t2.c1 WHERE t1.c2 = ‘ResNo’ AND t2.c2 = ‘TelNo’ 왼쪽이 Left Outer Join 오른쪽이 Right Outer Join 입니다. SELECT t1.c1, t2.c1 FROM table t1 RIGHT OUTER JOIN table t2 ON t1.c1 = t2.c1 WHERE t1.c2 = ‘ResNo’ AND t2.c2 = ‘TelNo’
  • 57. MariaDB 서버 구축하기 ■ Index • Index란 1. 간단히 정의 - 각 테이블들의 Row에 색인 달기 2. 고급지게 정의. - 테이블에 저장된 데이터를 빠르게 조회하기 위한 데이터베이스 객 체 - B-Tree구조를 가짐(B-Tree Index의 경우) - Index는 논리적/물리적으로 테이블과 독립적임 57
  • 58. MariaDB 서버 구축하기 ■ Index • Index의 구조 – 이론. 58
  • 59. MariaDB 서버 구축하기 ■ Index • Index와 Data의 분리 1. Data Table Space와 Index Table Space를 분리. - 대부분의 RDBMS는 테이블을 정의할때 Data저장장소와 Index저 장장소를 명시해서 만든다. - Index의 저장장소를 명시하지 않으면 Data저장 장소를 Index의 저 장 장소로 같이 쓰인다. 59
  • 60. MariaDB 서버 구축하기 ■ Index • Primary Index 1. 프리머리 인덱스란? - 테이블 내의 복수개의 tuple들 중 해당 키 값을 가지고 있는 tuple 은 오직 하나임을 나타내준다. 2. 간단히 테이블안의 특정 컬럼에는 어떤한 값도 중복되지 않 고 존재한다. 즉 유일하다. 60
  • 61. MariaDB 서버 구축하기 ■ Index • Primary Index 1. Primary Key 생성법 61 CREATE TABLE Person( SEQ INT AUTO_INCREMENT, 주민번호 CHAR(14), 이름 VARCHAR(15), 이메일 VARCHAR(40), 전화번호 CHAR(13) CONSTRAINT pk_key PRIMARY KEY (SEQ)) ALTER TABLE Persons ADD CONSTRAINT pk_seq PRIMARY KEY (SEQ)
  • 62. MariaDB 서버 구축하기 ■ Index • Primary Index 2. Primary Key 사용 이유 - 데이터의 중복값을 허용하지 않음. - 제일 빠른 검색의 조건 - Primary Key 생성시 Primary Index 자동생성. 이로 인해 데이터 검색 속도 향상 - 테이블 관계조건을 맺는 용도로 사용. - 데이터 통합 및 역공학시 기준점으로 사용되어 작업이 편리해짐. 62
  • 63. MariaDB 서버 구축하기 ■ Index • Clustering Index - 정의 1. 테이블에 데이터가 Key 배열에 순서적으로 입력되어 있음. 2. SQL에서 WHERE조건을 검색할 때 클러스터링 인덱스를 최 우선으로 두고 검색을 시작함. 즉 우선순위가 높음. 3. 대용량 처리시 일반 인덱스보다 2배정도 처리 성능이 우월 함. 63
  • 64. MariaDB 서버 구축하기 ■ Index • Clustering Index - 모습 64
  • 65. MariaDB 서버 구축하기 ■ Index • Clustering Index 1. 생성방법 65 CREATE INDEX idx_seq_cluster ON Person(SEQ) CLUSTER;
  • 66. MariaDB 서버 구축하기 ■ Index • UNIQUE Index 1. Unique Index 의 특징. - Primary Key와 마찬가지로 데이터 중복을 허용하지 않는 인덱스. - Primary Key와의 차이는 Null값도 데이터로 보기 때문에 허용하는 것의 차이. - 여러개 생성이 가능함. - 그러나 분명한 차이가 있기 때문에 따로 만들어 둔것. - Primary Key와 Unique Index 의 차이를 반드시 이해할 것. 66
  • 67. MariaDB 서버 구축하기 ■ Index • Unique Key 1. 생성방법 67 CREATE UNIQUE INDEX idx_seq ON Person (SEQ) CREATE UNIQUE INDEX idx_주민번호 ON Person (주 민번호)
  • 68. MariaDB 서버 구축하기 ■ Index • Index의 Include 옵션 1. Create index 의 Include 용도 - Covering index로 사용. - SQL의 WHERE 조건에서 평소에는 잘 사용하지 않으나 어쩌다 필 요에 의해서 사용되는 컬럼에 사용. 68
  • 69. MariaDB 서버 구축하기 ■ Index • Index의 Include 옵션 1. 이론 - 일반적으로 복합인덱스 생성시 평소 잘 사용하지 않는 컬럼까지 복 합 인덱스로 생성시 필요이상의 인덱스 깊이가 생기게 됨. - 이로 인해 인덱스의 깊이가 깊어지게 되고 그에 따른 추가적인 디 스크 용량이 더 필요하게 됨. 69
  • 70. MariaDB 서버 구축하기 ■ Index • Index의 Include 옵션 1. 이론 - 평소 잘 사용되지 않는 컬럼을 Include옵션으로 빼두고 만약 필요 할시 이용함. - 이렇게 해두면 인덱스 깊이는 크게 늘어나지 않고 인덱스 크기도 크게 되지 않게 되어 디스크 용량도 줄어들게 됨. 70
  • 71. MariaDB 서버 구축하기 ■ Index • Index 유지보수 1. 한테이블당 인덱스 갯수 - 가능하면 5개 미만으로 유지. 2. 중복되는 인덱스를 여러개 만들지 말것. - SEQ, 주민번호 - 인덱스 1번 - SEQ, 주민번호, 이메일 - 인덱스 2번 71
  • 72. MariaDB 서버 구축하기 ■ Index • Index 유지보수 3. 마스터 테이블은 Clustering Index로 만들것. - 클러스터링 비율이 1 이하이면 다시 생성. 4. 정기적으로 Table index 재생성. - 테이블에 DML이 많이 일어나면 테이블 인덱스 효율이 떨어짐. - 인덱스 재생성 만으로 2-10% 사이의 성능 향상을 기대해볼 수 있음 . 72
  • 74. MariaDB 서버 구축하기 ■ LOB • LOB 컬럼의 정의. 1. 일반적으로 테이블 생성시 큰 사이즈의 컬럼 저장장소를 따 로 생성. 2. CHAR, VARCHAR, BIGINT에서 만들 수 있는 허용범위를 벗어난 경우 이곳에 저장. 74
  • 75. MariaDB 서버 구축하기 ■ LOB • LOB 컬럼의 운용 - 일반적인 LOB방식 75 Bufferpool Normal Tablespace LOB Tablespace Database
  • 76. MariaDB 서버 구축하기 ■ LOB • LOB 컬럼의 운용 - 일반적인 LOB방식 76 Normal Tablespace LOB Tablespace Database Bufferpool
  • 77. MariaDB 서버 구축하기 ■ LOB • Inline LOB 컬럼의 문제점. 1. 메모리 낭비가 심할 수 있음. 2. Prefetcher와 IO CLEAN이 자주 일어날 수 있음. 3. 자주 사용되는 ROW가 우선순위에서 밀려날 수 있음. 4. 보통 4000Byte정도에서 사용할것을 권고합니다. 77

Editor's Notes

  1. 오늘 어떤 내용으로 강의를 하게 될지 살펴보겠습니다. SQL -> 아시다시피 DBMS에 명령을 내리는 언어입니다. 이 명령을 내리는 언어가 어떻게 작성되느냐에 따라 성능은 제각각으로 나오게 됩니다. 명령을 내리는 사람이 잘 내리면 DBMS는 그만큼 성능을 보장합니다. 하지만 명령을 내리는 사람이 수준이 낮다면?? 아마 DBMS는 죽어나갈 것입니다. Optimzer -> DBMS의 핵심. 사람으로 따지면 뇌라고 할 수 있습니다. SQL로 DBMS에 명령을 내리면 옵티마이저는 이 명령을 받아 어떻게 수행할지 판단하게 됩니다. 이 옵티마이저에 대해 한번 알아보고 과연 어떤 일들이 일어나고, 이 일어나는 일련의 행동들을 안다면 좀더 효과적으로 SQL을 짤 수 있게 됩니다. Index -> 옵티마이저가 원하는 데이터를 찾기위한 지름길입니다. 이 지름길은 여러가지가 있습니다. 이 지름길이 어떻게 만들어 지고 수행되는지 알아보도록 하겠습니다. Inline LOB -> lob이 어떻게 생성되고 불려지는지 알아보고 Lob의 성능을 높일 수 있는 방법을 알아보도록 하겠습니다.
  2. 여러분은 휴가를 받고 친구들과 일정을 맞추고 부산 해운대로 여행을 가려고 합니다. 해운대로 가능 방법은 여러가지 길이 있습니다. 초행길이니 만큼 네비게이션을 이용해 위치를 물어보도록 합니다. 자 어떤 내용을 확인할 지 한번 체크해 보도록 할까요??? /* 위의 내용 읽기 */ 이 과정이 끝나면 목표 여행지에 도착하고 여행을 즐기면 될 것입니다.
  3. 여기에 어떤 쿼리가 하나 있습니다. 쿼리도 마찬가지 일겁니다. 사용자가 SQL을 이용해서 원하는 데이터를 리턴하게끔 명령을 내리면 DBMS에서는 여러 작동이 일어나고 사용자에게 최선의 방법을 이용해서 빠른 속도로 정확한 데이터를 리턴해주는것이 목표가 됩니다. 그렇다면 자, 이 SQL을 보면 어떤게 떠오르시나요??? 한번 간단히 훑어본다면… 아래에서 보시죠. 어떤 테이블이 드라이빙 테이블이 될까요???? 그리고 위로 천천히 올라가면 조인에 관련된 내용들이 있습니다. 저 조인들은 인덱스를 탈까요 안탈까요??? 그외 정렬도 있고… 힌트도 있고…. 어떤 컬럼은 데이터 타입이 무엇이고… 혹시 저 컬럼은 LOB타입일까???? 뭐 많은것들이 떠오르시리라 생각합니다. 다 좋습니다. 그런데 이 쿼리를 DBMS는 어떻게 풀어낼까요?? 지금부터 DBMS로의 여행을 떠나보도록 하겠습니다.
  4. 앞의 내용들을 DBMS입장에서 매칭된다고 생각한것을 한번 입력해 봤습니다. 억지인것도 있기는 한데 아마 이런식으로 비슷하게 대입이 되지 않을까 생각합니다. DBMS도 자신이 가지고 있는 정보를 이용해서 나름대로 최선을 방법을 찾아 사용자에게 빠른 방법으로 어떻게 리턴해줄지 많은 고민을 합니다. 그래서 간략하게 한번 제 나름대로 생각해서 대입해보았습니다. 지금부터 본격적인 강의를 시작해보도록 하겠습니다.
  5. 제일 먼저 옵티마이저에 대해서 한번 배워보도록 하겠습니다. 이 옵티마이저를 얼마나 이해하느냐에 따라 DBMS의 성능을 굉장히 크게 좌우하기도 합니다. 그만큼 중요한 내용이며 MS-SQL, Oracle, IBM, MySQL 같은 회사들도 개발을 시작하기 전에 옵티마이저 운용 방식을 이해하라고 할만큼 아무리 강조해도 지나치지 않을 중요한 핵심내용이 바로 옵티마이저 입니다. 그러나 여기서 다루기에는 너무나 방대한 내용이기 때문에 중요한 핵심 몇가지만 배워보도록 하겠습니다.
  6. 옵티마이저. DBMS의 핵심 기술이자 가장 많은 개발비용이 투자되는 기능입니다. 이 옵티마이저 성능에 따라서 SQL 성능이 느릴수도 있고 빠를수도 있기 때문입니다. 이 Optimzier는 DBMS 내부적으로 데이터에 대한 많은 정보를 가지고 있다면 그 기초자료를 중심으로 최적의 길을 찾아 데이터를 가져옵니다. 네비게이션에서 출발지와 도착지를 입력하면 추천길 몇가지를 안내하듯이 마찬가지로 DBMS도 최적의 길을 판단합니다. 데이터 개수, 인덱스 상태, 어떤키를 가진 테이블인지, 이 테이블이 View인지, 임시테이블지, 이외 기타 여러가지 상태들을 참고해서 최적의 경로로 실행 계획을 만들고 그 실행계획에 따라서 사용자가 요청한 Data를 Return하게 됩니다. 이게 바로 옵티마이저의 핵심 기능입니다.
  7. 그런데 이 옵티마이저는 운용방식에 따라 이름이 붙여지기도 합니다.현존 RDBMS에서 모두 채택하고 있는 방식입니다. 바로 CBO, Cost based Optimizer입니다. 원래는 RBO, 즉 Rule Based Optimizer란 내용도 있는데 이젠 전혀 사용하지 않는 관계로 그냥 이런것이 있었다 정도로만 전해지고 있습니다. 이 CBO, 풀어쓰면 비용기반 옵티마이저 정도가 되겠죠??? 그런데 IT용어서에 비용이 나오는 이유는 가장 간단한 이유가 적용이 됩니다. 바로 가장 적은 비용으로 최적의 효과를 보는것, 이게 궁극적인 목표입니다. 아무리 빠른 SSD와 메모리를 가졌다 하더라도 RDBMS는 비용기반이기 때문에 병목구간을 못찾아 내거나 문제를 찾아내지 못한다면 성능을 제대로 낼 수가 없습니다. 그렇다면 이 비용을 옵티마이저가 판단하는 방법을 알아보겠습니다.
  8. 이 CBO는 DBMS DBMS의 모든 상태를 수집합니다. 인덱스 상태, 데이터 분포도, 그리고 테이블에 있는 Key나 인덱스, 그리고 테이블과의 참조 제약, 기타등등 수많은 정보를 가지고 있습니다. 그런데 여기에 있는 참고자료들은 최신의 것일수록, 최근의 통계데이터일수록 가장 좋은 실행계획을 만들어 낼 수 있습니다. 이 실행계획을 위해 대부분 RDBMS의 데이터 수집을 전략적으로 수행하기도 합니다. 그럼 어떤것들이 있는지 한번 알아보겠습니다. /* 위의 내용 리딩 */
  9. 이 그림은 옵티마이저가 실행계획을 어떻게 만들어 내는지를 보여주고 있습니다. 이중에서 가장 중요한건 바로 /*에니메이션 실행 */ statistics 즉 통계정보 수집입니다. 이 통계정보를 이용해서 사용자가 수행을 요청한 SQL을 어떻게 실행할 지 판단하게 됩니다. 하지만 이 통계정보가 최신데이터로 유지가 되지 않는다면 올바르지 않은 실행계획을 만들게 됩니다. 그래서 통계수집은 굉장히 중요한 지표가 됩니다. 이 통계정보를 보는 방법은 DBMS마다 틀립니다. 간단하게 통계정보를 보는 방법을 알아겠습니다.
  10. 모든 DBMS는 각자 자신의 정보를 가지고 있는 Meta데이터를 가지고 있습니다. 이 데이터를 Oralce에서는 Dictionary, DB2에서는 카탈로그, MySQL에서는 Information Schema라고 부르기도 합니다. 이 데이터를 보시게 되면 통계정보가 수집이 되었는지, 수집이 되었다면 언제 수집이 되었는지를 모두 나타내 줍니다. 이 통계정보를 최신의 데이터로 유지하여 DBMS가 최석의 실행계획을 만들 수 있도록 합니다. 먼저 Meta데이터를 뒤져 특정 테이블이 통계정보가 수집되었는지 확인합니다. 현제 테이블은 통계데이터가 전혀 수집되어 있지 않습니다.
  11. dbms_stats_gather_stats라는 프로시저를 이용해서 특정 스키마의 특정테이블을 통계수집합니다. 후에 저 쿼리를 이용해서 데이터 딕션어리를 뒤지면 다음과 같이 수집되어진 것을 볼 수 있습니다. /* 그림 설명 */
  12. 통계정보를 최신의 데이터로 유지하고 만들었다면 이제 실행계획을 한번 확인해 보도록 하겠습니다. 이 실행계획은 DBMS마다 보는 방법과 파악 방법이 약간씩 차이가 있습니다. 하지만 궁극적으로 보는 목표는 비슷합니다. 하나의 DBMS 패턴을 익히신다면 다른 DBMS의 실행계획을 확인하는것도 어렵지 않은 일이라 판단됩니다. 자 지금부터 실행계획을 한번 보도록 하겠습니다. 먼저 다음과 같이 실행계획을 볼 SQL을 작성 후 맨 위에 Explain For를 입력하고 수행을 합니다.
  13. 후에 내용을 보면 다음과 같은 내용의 어떤 메세지가 떨어집니다. 이것을 이용해서 내가 작성한 SQL이 어떻게 돌아가는지 확인해 보시면 됩니다. 이 실행계획을 분석하는건 아시다 시피 시간이 걸리고 또한 별로도 과목이 잡혀있을 만큼 설명해야 할것이 많아 이정도로만 하겠습니다. 중요한것은 반드시 DBMS의 통계정보를 어떻게 보는지, 과연 제대로 데이터가 수집이 되었는지, 인덱스는 잘 살아있는지 확인해보시는것이 중요합니다. /* DBMS별 스크린샷 */
  14. 우리는 여행을 갈때 무조건 가지는 않습니다. 최적의 시나리오를 한번 짜보고 출발을 합니다. 예상되는 막히는 곳은 어딘지, 공사중인 도로가 있는지 알고 있다면 더 빠른 코스로 목적지에 도착할 수 있을 것입니다. 또한 가는길에 좋은 곳이 있다면 들려 경치를 구경하기도 합니다. 겸사겸사 맛집을 찾아 밥을 먹기도 합니다. 이렇듯 생각없이 여행을 무조건 출발하는것도 좋지만 계획성있게 여행을 한다면 시간이 아깝지 않게 여행을 할 수 있을 겁니다.
  15. DBMS옵티마이지도 마찬가지 입니다. 사용자들의 쿼리를 그냥 받아들이지 않습니다. 나름대로 평가를 해보고 사용자의 쿼리를 재작성 합니다. 단순한 쿼리는 특별히 문제가 없는 한 변경되지는 않습니다. 하지만 테이블 조인이 4개 이상 넘어간다거나 기타 다른 필터링이나 펑션 사용이 많으면 옵티마이저 나름대로 이 쿼리를 평가하게 됩니다. 쿼리가 옵티마저가 판단 시 적합하지 않다 판단이 서면 쿼리를 재작성 하게 되는데 이것을 쿼리 리라이트라고 합니다. 쿼리 리라이트가 어떻게 되는지 한번 DBMS들 마다 어떻게 표현이 되는지 확인해 보도록 하겠습니다.
  16. 그런데 대부분 개발자분들이 이 쿼리 리라이트는 안보시는 분들이 많습니다. 물론 보기도 어렵거니와 DBMS에 대한 지식없이는 보기가 힘든게 사실입니다. 하지만 이걸 대충 훑어보셔도 아 나의 SQL이 이렇게 변경되서 흘러가고 있구나란 사실을 알 수 있습니다. 또한 이렇게 변경되면 안되는데?? 라는 구간이 보일 수도 있습니다. 의도치 않게 변형이 된 것이죠. 이걸로 인해서 Optimizer버그를 알 수도 있습니다. 또한 분명히 속도가 나와야 할 구간에서 속도가 나오지 않는다면 DBMS에서 뭔가 잘못 처리하고 있다는 얘기가 되겠죠. 이런것들을 판별해 볼수가 있습니다.
  17. 그럼 지금부터 Query Rewrite가 어떻게 수행되는지 한번 알아보도록 하겠습니다. 그림 설명.
  18. 서울에서 부산으로 내려가는 방법은 여러가지가 있습니다. 교통수단에 따른 방법으로 갈 수도 있겠고..... 만약 자가용을 탄다면 여러 IC를 이용해 갈수도 있습니다. 고속도로를 이용해도 되고, 지방 국도를 이용해도 되고... 아니면 시간이 많으면 해안가를 뺑 돌아서 갈 수도 있을 것입니다. 이렇듯 한 목적지를 가는 방법은 여러가지가 있습니다. 복잡하게 갈 수도 있겠고 단순하게 갈수도 있겠고 여러상황을 고려해 막히는 부분은 우회하고 빠른길은 이용하는 하이브리드 형식으로 갈 수도 있겠죠
  19. 옵티마이저 레벨도 마찬가지입니다. RDBMS에 옵티마이저 레벨을 조정해서 복잡도를 설정하는 것입니다. 예를 들어 옵티마이저 레벨이 높다면 여러 복잡성을 계산하게 됩니다. DBMS의 여러가지 상태, 즉 인덱스라던지, 통계정보 수집 상태, IO, CPU, DISK등등의 모든 자원 상태를 파악하고 어떻게 가는게 가장 유리할지 최적의 경로를 만들어 냅니다. 옵티마이저는 이 경로, 저경로 등등 여러가지 경로를 직접 만들어 판단해 본 후, 최적의 경로를 사용자에게 리턴하게 됩니다. 시스템이 복잡할 수록 쿼리가 길수록 레벨이 높다면 좀더 많은 연산을 통해서 최적의 경로를 찾아낼 수 있습니다.
  20. 단순한 쿼리만을 날리는 DBMS라면 옵티마이저 레발 혹은 모드를 낮추는게 유리합니다. 필요없는 연산과 수행을 줄임으로써 옵티마이저에게 가장 쉬운 방향을 제시하게 됩니다. 즉 누가봐도 이게 정답인 거라면, 테이블이 조인이 2개 이하고 필터링 조건도 1,2개라면 굳이 옵티마이저 레벨을 높일 필요없이 낮게 설정해 주면 됩니다.
  21. DBMS마다 틀리긴 하지만 현제 세션에서 옵티마이저 레벨을 낮추는 방법이 있습니다. DB는 set 이란 변수로 현제 레벨을 조정 가능하고 MySQL도 마찬가지로 set이란 변수를 통해 변경이 가능합니다. 오라클 또한 마찬가지입니다. 오라클 세션변수를 통해서 현제 레벨이 변경이 가능한 만큼 사용해 주시면 좋을 것 같습니다. SQL튜닝 프로젝트에 참가해 보신 경험이 있는 분이라면 이 옵티마이저 레벨 변경을 통해 쿼리 튜닝을 하시는 분들을 종종 보실 수도 있습니다.
  22. Driving Table. 테이블 Access에 대해 기준이 되는 테이블입니다. 이 Driving Table은 3-4년차 이상 되신 분들은 아마 대부분 이해하고 계실 겁니다. 혹시 이 Driving Table에 대해서 모르셨던 분이라면 반드시 알아보시기를 추천드립니다. 그만큼 아무리 많이 강조를 해도 부족하지 않은게 이 Driving Table입니다. 어떤 Driving Table을 선정하느냐에 따라 Batch SQL은 15일이 걸리던게 3-4일로 줄일 수도 있는 마법같은 방법입니다. 그렇다면 왜 Driving Table이 중요한지 알아보겠습니다.
  23. 앞서 말한대로 Driving Table은 Access Path를 주도한다고 했습니다. 즉 기준이 되는 테이블을 말하는 것입니다. 이 기준이 되는 테이블이 데이터가 필터링이 되면 될수록, 필터링 된 데이터가 작으면 작을수록 좋습니다. 그렇게 된다면 추후 Join이 필요할 때 비교하게 될 데이터가 그만큼 줄어들기 때문입니다. 예를 들어 주민번호, 휴대폰번호, 이메일 주소 중 한가지만 데이터를 조회해도 한가지 결과만 도출될 것입니다. 이 데이터들은 대부분의 사이트에서 유일한 값이기 때문입니다. 이런 값들로 Driving Table을 조회할 수 있다면 좋겠지만 현실에서는 그렇지 못하는 경우가 태반입니다. 그래서 가능하면 Cardinality 즉 유일성이 가장 높은 데이터를 많이 가진 테이블을 Driving Table로 결정해야 합니다. 그러나 Driving Table이 만약 한국의 성별을 검색한다면?? 서울시에 사는 사람을 검색한다면?? 정말 엄청난 데이터가 필터링이 되어 리턴될것이 자명합니다. 이렇듯 Driving Table의 선정은 굉장히 중요합니다. 그럼 한가지 궁금한것이 생깁니다. 과연 Cardinality라는 용어입니다. 혹시 이 Cardinality라는 용어를 아시는 분 있나요??? 제가 한번 언급 했었습니다. 이 내용이 굉장히 중요합니다. 그럼 지금부터 한번 알아보도록 하겠습니다.
  24. 앞에서 Cardinality에 대해 한번 언급을 했는데 Cardinality는 바로 중복값을 제외한 데이터 갯수입니다. 간단하게 한번 예제로 알아보도록 하겠습니다. 여기 3가지 예제가 있는데 한번 맞추어 보도록 하겠습니다. /* 문제 풀이 */ 여기서 한가지 또다른 추론을 해볼수가 있습니다. Cardinality 갯수와 Row수가 같다면 이건 데이터가 중복값이 없는 유일한 컬럼 데이터라는 것입니다. 이건 뒤에서 배울 어떤 인덱스나 키와 연관이 있습니다. 무엇일까요?? /* 질문 답 받기 */ 예 맞습니다. 정답은 바로 Primary Key라는것을 유추할 수 있겠습니다. 이 Primary Key와 Index 에 대해서는 내용이 조금 있으므로 뒤에서 다루도록 하겠습니다.
  25. 혹시 여러분들중 Database 용어들중 Block Size 혹은 Page size라는 내용을 한번씩 보시거나 들어보신 경험이 있으신 분 있나요?? /* 질문 답변 받기 */ 예상하신 대로 아무도 손을 안드시는군요. 오, 님은 정말 DB에 대해 많이 아시는 분이라 감히 추측이 되는데요.... ㅎ Block, Page Size는 바로 한 Row가 가질 수 잇는 최대의 길이입니다. 즉 Char라던지 varchar, integer, date 등등 한 Row가 가질 수 잇는 최대의 길이입니다. 그리고 이 길이는 아까 설명을 드렸던 Buffer Pool이라는 메모리에 등록되는 길이입니다. 이 길이는 메모리안에 무수히 많이 등록이 됩니다. 자 그러면 여기서 한가지 생각을 해볼 수가 있는데요. 이 page size는 클수록 좋을까요? 작을 수록 좋을까요??? 이건 작아도 쓸데가 있고 커도 쓸데가 있다는, 즉 용도가 다른곳에 사용이 됩니다.
  26. 혹시 OLTP, OLAP라는 용어를 들어보셨나요??? 이 용어를 아시면 DB에 좀 관심이 있으신 분으로 혹은 중급 개발자 이상으로 생각하셔도 될 것입니다. 그만큼 DBMS에서는 중요한 언어입니다. OLTP : Online Transaction Processing 아주 간단히 웹 용도로 가장 많이 쓰이는 DB를 OLTP DB라고 합니다. DML 즉 Insert, Update, Delete가 가장 많이 활발히 일어나는 DB를 OLTP DB라고 합니다. 웹, 대쉬보드 모니터링, 티켓, 항공 등등이 다 OLTP DB라고 생각하시면 될것 같습니다. 이 OLTP의 대표주자는 바로 Oracle, MS-SQL, MySQL등등이 있습니다. OLAP : Online Analytical Processing 분석 시스템입니다. 이부분은 평소에 접하기 힘든 업무들이 주로 적용됩니다. ERP, DDS 등등이 이 용어로 쓰이게 됩니다. 자원관리 시스템, 업무 분석 시스템 등등이 여기에 쓰이게 됩니다. 이 OLTP의 대표주자는 DB2, Sybase등등이 있습니다.
  27. 자 그렇다면 아까했던 질문처럼 Page 크기가 작으면 좋을까요? 정답은 업무 비지니스 활용에 따라 틀립니다. 일반적으로 OLTP, 즉 웹서버와 같이 DML이 많이 일어나는 Database 서버에서는 Page 크기가 적을수록 좋습니다. 왜냐하면 Row Size가 클수록 Row를 업데이트 하는데 오버헤드가 상당합니다. 간단히 varchar를 기존에 10Byte가 저장되어 있던게 100byte로 입력된다면 이 크기만큼 Database는 Overhead를 감내해야 합니다. 하지만 Colum수가 작거나 사이즈가 작다면 DBMS가 받는 Overhead는 상당히 감소하게 됩니다. DataWarehouse용도, 즉 OLAP로 쓰신다면 Page Size가 클수록 좋습니다. OLAP용도로 쓰이는 데이터베이스는 Insert용도가 가장 많으며 Update, Delete가 많이 일어나지 않습니다. 그리고 데이터 또한 몇백메가 몇백기가로 데이터가 이동이 되기 때문에 Page Size가 클수록 유리합니다. 앞으로 Table을 생성하실 때 이 부분을 참고해 주시면 좋을 듯합니다.
  28. 혹시 데이터베이스에서 입력속도때문에 애를 먹은 기억이 없으신지요… 입력속도, 혹은 데이터가 잘 입력되지 않아 DBMS성능이 문제가 아닐까 의심해본 기억이 없으신지요?? 데이터 입력속도를 높이는 몇가지 TIP이 있습니다. 이걸 알고 계시면 좋을것 같아 이번장에서 소개합니다. 테이블에 데이터를 입력하는 방법은 Insert 말고 또다른게 있습니다. 아시겠지만 대표적인게 바로 Import와 Load라는 명령어 입니다. DBMS마다 데이터를 입력하는 방법은 2가지가 존재합니다. 그중에 대표로 쓰이는게 위의 2가지 입니다. 근데 이 두가지는 기술적으로 차이가 있습니다. 이 방법에 대해 간단하게 알아보겠습니다.
  29. 첫번째로 IMPORT입니다. 대표적인 데이터 입력방식 중 하나인데 이 특징은 다음과 같습니다. 테이블의 모든 제약을 점검하면서 데이터를 입력합니다. 또한 테이블의 인덱스를 모두 체크하고 입력. - Primary, Unique Key등등. 그렇기 때문에 속도가 느립니다. 대신, 느린만큼 안전합니다. Row by row로 입력하기 때문에 그만큼 안정성이 높습니다. 그래서 Table이 깨져도 복구시 쉽게 복구가 가능합니다. 이 IMPORT는 주로 몇십MB의 데이터를 입력할때, 혹은 안정성이 좀 요구되는 곳에 많이 사용합니다.
  30. 두번째로 LOAD입니다. 이것또한 대표적인 데이터 입력방식 중 하나인데 이 특징은 다음과 같습니다. 일단 데이터를 입력할 공간을 확보하고 데이터를 한꺼번에 밀어넣습니다. 이때 테이블의 인덱스를 모두 무시하고 입력을 합니다. 그리고 후에 인덱스, 제약조건등을 참고합니다. 그렇기 때문에 속도가 빠릅니다. 대신, 위험합니다. 데이터를 벌크형식으로 밀어넣기 때문에 DBMS 부하가 상당할 수 있습니다. 또한 데이터를 입력할때 테이블에 복구를 할 수 있는 옵션을 보통 사용하지 않습니다. 빠른 속도를 요구하기 때문입니다. 그래서 Table이 깨져도 복구가 쉽지 않습니다. 이 LOAD는 주로 몇십MB의 데이터를 입력할때, 혹은 안정성이 좀 요구되는 곳에 많이 사용합니다. 이 IMPORT와 LOAD사용법에 대한 차이를 인지하시고 데이터를 입력하실 때 좀더 나에게 효율적인 데이터 입력방법이 무엇인지 한번 고민해 보셨으면 합니다.
  31. 데이터 입력 속도를 높이는 몇가지 TIP을 안내해 드립니다. DBMS마다 아마 공통적으로 이와 비슷하고 또 이방법 말고는 아마 거의 대체적으로 찾기 힘드실 겁니다. 물론 다른 특색있는 방법을 제공하는 가이드라인도 있지만 이게 가장 표준적인 방법입니다. 일단 첫번째로 정렬메모리와 LOAD관련 메모리를 높이는 것입니다. 만약 인덱스를 삭제할 수 없다면 Index에 걸려있는 정렬때문에 정렬 메모리를 많이 잡게 됩니다. 또한 LOAD메모리가 작다면 메모리가 아닌 DISK에서 작업을 해야 하기 때문에 속도가 느리게 됩니다. 한가지 더, TEMP Space를 이용하고도 크기가 작다면 Swap영역으로 넘어가게 됩니다. 이때는 정말 최악의 성능을 자랑하게 됩니다. 그러므로 입력속도가 느리다면 위의 3가지를 한번 체크해 보셔야 합니다. 다른 방법은 테이블에 걸려있는 참조제약을 비활성화 시키고 인덱스를 잠시 삭제하는 방법입니다. 참조제약이 있다면 데이터 참고 조건을 테스트해야 하기 때문에 IMPORT방법으로 입력시 한가지 더 연산을 더해주는 셈이 됩니다. 또한 인덱스가 걸려있는만큼 DBMS에서는 추가적인 연산이 들어가게 됩니다. 그러므로 데이터를 입력 후 제약조건 및 인덱스를 걸어주시는것이 더 유리할 수 있습니다. 마지막으로 아카이브 로그 방식을 일시적으로 OFF시키는 방법입니다. 테이블을 생성하거나 테이블에 데이터를 입력하면 Database는 그 모든것을 기록으로 남깁니다. 데이터 입력때도 마찬가지입니다. 데이터를 입력하게 되면 데이터를 입력하는 만큼 데이터를 다시 기록으로 남기게 됩니다. 그런데 데이터도 입력하고 데이터 입력 기록도 일일이 남기려면 DBMS입장에서는 굉장히 곤욕스런 일이 됩니다. 그러므로 이 기능을 일시적으로 OFF시키고 데이터를 입력하면 좀더 빠른 속도를 보장할 수 있습니다. 디스크 교체는 최고의 방법중 하나입니다. SSD로 바꾸면 더할 나위 없겠죠. 아무리 성능을 튜닝해도 물리적인 속도가 따라오지 못하면 무리가 가는게 사실입니다. 이건 최후의 방법으로 거론되곤 합니다.
  32. SQL. 아시다시피 데이터베이스에서 원하는 데이터를 뽑아내거나 입력할때 쓰이는 언어입니다. 이 SQL을 잘 작성해야 원하는 데이터를 효율적으로 빠르게 가져 올 수 있습니다. 아시다시피 SQL을 어떻게 작성하느냐에 따라 성능이 많이 틀려집니다. 어떻게 작성을 하고 어떤 필터조건을 넣느냐에 따라 성능이 판이하게 틀려집니다. 지금부터 SQL작성 방법을 알아보도록 할텐데 3-4년차 이상 되시는 분들은 이미 아시는 내용이실 수 있습니다. 이미 아시는 내용이라면 내용을 다시 복습하는 기분으로 보아주시고 만약 새롭게 배우시는 분들이라면 정말 유익한 시간이 될거라 확신합니다.
  33. 아시다시피 데이터베이스는 DDL, DML, DCL로 데이터베이스를 컨트롤 하고 있습니다. DDL은 오브젝트 생성을 담당하고 DML은 OBJECT를 다루며 DCL은 트랜잭션을 관리합니다. 여기서 제가 말씀드리고 싶은건 바로 DML입니다.(화면 DML, DCL없애기) 이 DDL에서 데이터 타입으로 고민하신 적이 있으시지 않으십니까? Varchar가 맞을지 char가 나을지, date형식에서 date를 써야 할지 varchar를 써야할지…. 이런 몇가지를 오늘 좀 같이 고민해 보고자 합니다. 같이 얘기를 해보고 실제 어떻게 쓰고 계시는지 한번 토론해 봤으면 합니다.
  34. 다음과 같이 몇개의 컬럼과 속성이 있습니다. 문제가 있는 SQL일까요?? 아니면 없는 SQL일까요?? 문제가 있다면 어떤 문제일까요????? -> 질문하기 물론 문제가 없는 SQL입니다. 하지만 성능면에서는 문제가 날 수도 있습니다. 형변환 혹은 캐스팅이 일어나야 하기 때문입니다. 숫자형인 컬럼이 문자형의 데이터를 만나면 형변환을 해야 하기 때문에 그만큼 속도가 느려집니다. 다음에 간단한 예제들로 형변환 및 데이터 타입이 얼마나 중요한지 한번 알아보도록 하겠습니다.
  35. 개발중 테이블을 작성하실때 이 데이터 타입이 맞을지 이게 적당한 크기인지 헷갈리실 때가 분명히 있습니다. 그것들에 대해 한번 얘기를 나누어 보고자 합니다. 첫번째로 char과 varchar입니다. 문자열을 저장하는 컬럼 속성중에 하나입니다. 그런데 char와 varchar는 비슷하면서도 분명히 다릅니다. 일단 char의 속성에 대해 알아봅시다. char의 속성은 무조건 데이터 사이즈 만큼 채운다는 것에 있습니다. 4Byte의 문자열을 만들면 1자리만 입력해도 1자리를 제외한 나머지 3자리는 자동으로 특수 문자열로 채워집니다. 즉 공간을 무조건 채우는 겁니다. 이 속성때문에 장점과 단점이 나누어집니다. 단점 : 데이터 용량 낭비가 있을 수 있습니다. 데이터 크기를 예측을 잘못하면 낭비가 심할 수 있습니다. 장점 : 속도가 빠릅니다. 고정된 길이만큼 데이터가 채워지고 운영되기 때문에 조건절을 비교할 때 유리합니다. 또한 Update시에도 이미 데이터가 할당되어 있기 때문에 추가적인 오버헤드가 없습니다.
  36. 두번째로 varchar입니다. 문자열을 저장하는 또다른 컬럼 속성중에 하나입니다. varchar의 속성은 입력된 데이터 만큼 데이터를 채우는 것입니다. 10Byte의 문자열을 만들면 1자리만 입력하면 1자리 크기만 사용하는 것입니다. 즉 사용한10바이트 크기를 지정했어도 1바이트만을 이용하는 것입니다. 그만큼 용량 낭비가 줄어듭니다. 이 또한 속성때문에 장점과 단점이 나누어집니다. 단점 : 업데이트 속도가 느립니다. 이전 데이터보다 큰 데이터를 수정하려고 하면 기존데이터 크기보다 크기를 늘려야 하기 때문에 추가적인 오버헤드가 들어갑니다. 장점 : 용량 낭비가 적습니다. 정리 Char : 코드나 휴대폰번호같은 고정값의 데이터가 들어가는 속성. varchar : 주소같은 가변형 길이에 적합.
  37. http://scidb.tistory.com/entry/Varchar28-VS-Date-%EC%96%B4%EB%8A%90-%EA%B2%83%EC%9D%B4-%EC%9A%B0%EC%9B%94%ED%95%9C%EA%B0%80 http://ukja.tistory.com/265 가장 어려운 질문이 날짜 컬럼의 데이타 타입을 어떤것으로 쓰느냐일 것입니다. varchar로 쓰시는 분, data로 쓰시는분 다 있으실 겁니다. 현장에서는 이렇게 얘기하곤 합니다 date를 쓰기엔 현업의 상황을 잘 모르고 얘기하는거다, varchar로 쓰는게 편하다 하시는 분들도 계십니다. 하지만 varchar나 date가 속도면에서 차이가 없다면 벤더사들이 왜 저렇게 date컬럼을 따로 만들어 쓰는 걸까요?? 프로젝트혹은 개발하실때 날짜 컬럼을 varchar로 쓰시는 분? 아니면 date로 쓰시는 분?? 과연 어떤 방법이 더 빠를까요? 아시는분???
  38. 결론부터 말씀드리면 varchar보다 date가 훨씬 빠릅니다. 이후에 배울 Optimizer라는 SQL수행기가 varchar와 date를 분명히 다르게 처리하기 때문입니다. 실 예로 테스트를 해본 사이트들의 공통된 결론은 date가 좀더 빠르다는 것입니다. 또한 데이터 품질에 문제가 발생할 수 있습니다. date형식의 데이터가 들어가야 하나 ‘ABCD’같은 문자열이 들어갈 수도 있기 때문입니다. 이렇게 된다면 데이터 조회시 엉뚱한 컬럼에서 조회가 된다면 문제가 발생할 소지가 다분히 큽니다. 또한 일반적으로 date를 varchar로 주장하시는 분들은 보통 varchar(8)크기를 주장합니다. YYYYMMDD형식의 8자리이기 때문입니다. 하지만 date는 7자리 입니다. 속도면에서도 당연히 어느정도 빠를 여지가 충분히 있습니다. 또한 varchar에서 Between의 조건은 엄연한 String에서의 사이입니다. 즉 날짜가 아니라는 것이죠. 앞으로 날짜는 날짜답게 날짜 컬럼을 쓰는게 어떠실지 한번 고민해 보셨으면 합니다.
  39. 정수형에 대해서 알아보겠습니다. 일반적으로 DBMS의 Integer형식은 몇바이트일까요???? 그리고 BIGINT는 몇바이트 일까요?? /* 사람찍어 질문 */ 그렇습니다. Integer는 4byte, Bigint는 8byte입니다. 특히 Singed냐 Unsigned냐에 따라서 정수형은 더 늘어날 수도 있습니다. 그런데 혹시 테이블을 만들때 컬럼의 데이터 타입을 입력하고 자릿수를 입력합니다. 그런데 정수형은 그 의미가 다릅니다. 문제는 이 정수에 대해 의미를 잘못 알고 자릿수로 오해해 입력하는 개발자분들이 계십니다. 자 이 숫자의 의미는 무엇일까요?? /* 사람 지목. 양해를 구한다. */ 알고 계시면 정답을 말씀해 주시고 모르신다면 이 기회에 알아가는 기회가 되셨으면 합니다. 참고로 감히 제가 절대로 테스트하기 위해서 질문 드리는게 아니니 오해 거두어 주시고 편하게 말씀해 주셨으면 합니다. 그렇습니다.Integer 속성의 뒤는 특정 역활을 나타내는 것입니다. 그래서 DECIMAL이나 기타 DBMS별 특정 정수 Function은 그의미가 있는 것입니다. 그 의미들은 다음과 같습니다. /* 위의 맨 아래 내용 읽기 */
  40. 중복제거 방식은 가장 대표적인게 2가지가 있습니다. 바로 Group by와 Distinct입니다. 이 2가지는 몇가지 차이와 특성이 있습니다. 이 차이에 대해서 간단히 알아보겠습니다.
  41. Group by와 Distinct의 차이는 바로 중복제거입니다. 물론 둘의 기본적인 용도는 다릅니다. 말 그대로 Grouping과 중복 제거입니다. 하지만 어차피 공통된 목적은 중복제거라는 것입니다. 그런데 이 Group by와 Distinct는 약간의 차이가 있습니다. /* 정렬의 목적 읽기 */ 그리고 약간의 속도차이도 있습니다. /* 속도비교 읽기 */ 현제 DBMS들은 distinct와 groupby가 순수 데이터 리턴에서는 큰 차이는 없습니다. 다만 정렬이 필요하기 때문에 distint에서 Group by가 distinct보다는 더 빠른것이 아닌가 하는 생각입니다.
  42. 성능을 높이기 위한 팁은 무궁무진합니다. 제가 DB2 엔지니어로 있을때 IBM에서 제공된 TIP만 200가지가 넘었습니다. 그런데 제가 느낀 솔직한 느낌은 뻔한것이었습니다. 근데 이게 가장 중요합니다. 가장 기본적인 것, 가장 중요한 요소인데도 불구하고 기본적인것을 지키지 않음으로서 성능이 낮다고 얘기를 합니다. 가장 중요한것 기본을 지키는 것인데, 이뻔한 기본을 몇가지 알아보도록 하겠습니다. DECODE - 이 펑션을 사용하면 내부적으로 이것을 쿼리 재작성을 통해 다시 SQL을 만들게 됩니다. 그래서 추가적인 연산이 들어가게 됩니다. 그래서 가능하면 사용을 조금 자제하시는게 좋습니다. OR문 - 이거 아니면 이거기때문에 잘못하면 Full Table스캔이 들어가며 양쪽다 검색이 들어가야 하기 때문에 그만큼 추가적인 부하가 들어갑니다. DISTINCT : /* 위에거 읽을것 */
  43. 당연히 인덱스를 사용하는 컬럼을 Where조건에 사용해야 할 것입니다. 또한 Primary Key를 사용해서 조건을 검색해야 합니다. 하지만 대부분 알면서도 걸 수 없는게 현실입니다. 그럼 인덱스를 사용할때 어떤것을 주의해야 하는지 간단하게 알아보겠습니다. /* 위의 인덱스 사용 아래 읽기 */ 특히 3번째 명확한 Where조건을 사용하기. 이부분이 중요합니다. 이것을 한번 예제를 통해 알아보도록 하겠습니다.
  44. 위의 예제에 대해 한번 알아보겠습니다. 테이블을 하나 만듭니다. 그리고 인덱스를 생성하고 데이터를 하나 넣습니다. 그리고 SELECT를 할때 컬럼에 인위적으로 날짜만을 비교해서 데이터를 SELECT합니다. 이것의 문제는 처음에 등록할때 DATETIME, 즉 날짜와 시간을 동시에 가지고 있는 속성이라는 점입니다. 자 이 SQL은 인덱스를 탈까요 안탈까요? 만약 탄다면 이것은 정상일까요 비정상일까요? 또한 이것은 DBMS의 버그일까요?? 아니면 정상적인 DBMS라 부를 수 있을까요?? /* 질문 답변 받기 */ 전 아직 결론을 못내렸습니다. 일단 제가 IBM 파트너사에서 DB2기술 엔지니어로 근무를 했을때 공식답변은 버그라는 답변을 받았습니다. 인위적인 컬럼 변경은 인덱스를 탈수 없을 뿐더러 데이터 형식또한 틀렸기 때문에 그렇다는 것입니다. 하지만 인덱스를 탈때도 있기 때문입니다. 왜냐하면 이게 등록일자가 유일하다면 이만한 인덱스가 없기 때문입니다. 그래서 저는 개인적으로 아직 의문점을 가지고 있는 문제이기도 합니다.
  45. 혹시 여러분은 ANSI SQL이라고 들어보셨는지요. ANSI, 즉 표준 SQL입니다. 이전에는 SQL들은 벤더사마다 자기들이 표준인양 마음대로 SQL을 만들어서 제공했습니다. 그래서 개발자들이 특정 벤더 SQL을 표준 SQL마냥 이해하고, 이 SQL이 다른 SQL에 실행이 안되면 왜 지원이 안되냐고 따지기도 했었습니다. 주로 오라클을 사용하시던 분들이 그랬습니다. 특히 (+)모양이 LEFT, RIGHT OUTER JOIN 표준이라고 생각하시는 분들도 의외로 많았습니다. 하지만 이젠 DBMS도 춘추전국시대이니 만큼 표준 SQL이 필요한 시점이 되었습니다. 이 ANSI SQL은 표준 SQL이니 만큼 대부분의 DBMS에서 지원이 된다는 사실입니다. 그럼 ANSI SQL에 대해서 간단히 알아보겠습니다.
  46. 여기 SQL문이 하나 있습니다. 당신은 입문단계의 개발자입니다. 그리고 처음으로 Join의 개념을 배우고 있습니다. 조인이 있고 조건문이 있습니다. 자 이건 Left outer Join일까요???? 아니면 Right Outer Join일까요??? 참고로 우리 나라문법은 왼쪽에서 오른쪽이기 때문에 위의 Join은 Right Outer Join일것 같습니다. 여러분은 어떠신가요??? 전 주니어때 오른쪽에 (+)가 있어서 Right Outer Join으로 생각했습니다. 제가 여기서 ANSI SQL 얘기를 꺼내는것은 이젠 트렌드이자 중요한 개념이기 때문입니다. 실예로 이제 고객사들도 SQL을 ANSI SQL을 사용함으로서 특정 벤더에 종속되지 않겠다라는 의지를 표명하고 있습니다. 그래서 ANSI SQL은 굉장히 중요합니다.
  47. 위의 SQL들은 ANSI SQL이라는 표기 방법입니다. SQL을 몰라도 알수 있을것 같습니다. 왼쪽이 Left Outer join, 오른쪽이 Right Outer Join입니다. 이렇듯 ANSI SQL은 어떤 개발자가 보더라도 쉽게 판독 할 수 있다라는 점이 있습니다. 가끔 오라클 문법을 타 DBMS에 사용하고 이게 왜 되지 않냐라고 따지는 개발자분들, 혹은 엔지니어분들이 계십니다. 그럴때마다 고객들 혹은 개발자분들에게 어디가셔서 그런 소리 하지 마시라고 부탁드리곤 합니다. 또한 고객사분들도 오라클 라이선스 정책에 불만과 문제를 제기하고 특별하게 민감한 시스템을제외하고는 빼고 있는 추세입니다. 참고로 상징적인것이 삼성화재 SAP DB구축에서 오라클이 탈락되었다는것이 아마 좋은 예일 겁니다. 또한 고객대부분의 고객사들이 라이선스 비용때문에 오라클을 걷어내려고 무지 애쓰고 있다는 사실입니다. 앞으로 개발자분들도 오라클만을 고집하지 않으셨으면 하는것이 제 바램입니다.
  48. 인덱스. 여러분들도 아시다시피 인덱스는 데이터에 색인작업을 하는 것입니다. 이 색인작업을 통해 좀더 빠르게 데이터를 찾고자 함에 그 목적이 있습니다. 그럼 인덱스를 고급지게 어떻게 정의를 하느냐, 바로 이렇게 말을 합니다. /* 고급지게 정의 내용 읽기 */
  49. 인덱스는 구조는 다음과 같습니다. 오른쪽에 테이블이 다음과 같이 정의되어 있습니다. 그리고 EMPNO에 인덱스를 생성합니다. 그러면 왼쪽과 같이 어떤 특별한 정보가 담겨있는 데이터가 DBMS내에 생성이 됩니다. 즉 테이블의 해당 데이터가 가지고 있는 물리주소를 인덱스가 가지고 있게 되는 것입니다. 그래서 사용자가 특정 EMP넘버를 조회하면 인덱스에서 이 물리적 주소를 가지고 바로 테이블 데이터에 가서 해당 ROW를 리턴하게 됩니다. 이게 바로 인덱스의 기본적인 구조입니다.
  50. 테이블을 만들때 RDBMS는 대부분 데이터 저장장소와 인덱스 저장장소를 따로 분리해서 저장할 수 있는 옵션을 제공합니다. 왜냐하면 바로 I/O때문입니다. 데이터와 인덱스가 같은 공간에 있으면 아무래도 I/O경합이 일어나게 됩니다. 즉 같이 데이터와 인덱스를 한 공간에서 읽어내야 하기 때문입니다. 그래서 가능하면 따로 저장하시는게 굉장히 유리합니다.
  51. 제일 먼저 프리머리 키에 대해 설명을 하겠습니다. 이 프리머리 키는 굉장히 중요한 요소중에 하나입니다. 그렇다면 너무 기본적인 질문을 하나 하겠습니다. 이 프리머리키는 인덱스가 있을까요 없을까요?? /* 답변 듣고 */ 이 프리머리 키의 또하나의 특징은 테이블마다 가능하면 존재해야 한다는 것입니다. 기준이 되는 키이기 때문에 일반인덱스로 생성시 DBMS가 판단해서 이 컬럼에 유일한 값만이 있고 어떠한 인덱스도 없다면 최초 인덳 생성시 강제로 프리머리 인덱스로 잡아버리는 경우도 있습니다.
  52. 프리머리 키를 생성하는 방법중 하나는 바로 테이블을 만들때 생성하는 방법입니다. 테이블을 최초 생성시 밑에 제약조건을 걸겠다는 명시 - 즉 Constraint 라는 예약어를 입력하여 Primary Key를 생성해 줍니다. 또하나의 방법은 테이블을 변경해서 만드는 것입니다. 프리머리 키는 인덱스가 아닌 제약조건이기 때문에 인덱스와는 틀리게 ALTER문으로 만들어야 합니다. 일반적인 인덱스는 CREATE문으로 생성이 가능하지면 Primary Key는 그렇지 않습니다.
  53. 혹시 프리머리 키를 사용하는 이유를 알고 계신지요?? 테이블마다 하나씩 가능하면 중복되지 않는 컬럼들로 꼭 만들어야 한다고는 배웠습니다. 그러나 왜 써야 되는지에 대해서 한번 고민해 보신적이 있으신지요?? 아까 말씀드렸듯이 Primary Key는 테이블의 가장 기본적인 키입니다. 기본적인 키인 동시에 기준점이 되는 키이기도 합니다. 그래서 테이블을 생성시 가장 첫번째 컬럼에 중복되지 않는 데이터로 이루어진 컬럼을 Primary Key로 잡게 됩니다. 또한 이 프리머리 키의 장점은 데이터의 무결성을 지킬 수 있다는 것입니다. 유니크 키도 마찬가지겠지만은 이 프리머리키값은 테이블에 하나만 생성이 가능하고 Null값 또한 허용되지 않을 만큼 강력한 데이터 무결정을 보장합니다. 또한 데이터 통합이나 데이터 베이스 역공학 같은 작업 시 기준이 되는 컬럼을 알 수도 있습니다. 이렇듯 장점이 많은 프리머리키를 반드시 테이블마다 하나씩은 사용해 주시는것이 좋을 듯 합니다.
  54. 지금까지 프리머리 키를 좀 길게 설명한 이유를 이것을 알려드리기 위해 조금 할애를 한 것입니다. 바로 클러스터링 인덱스 입니다. 이 클러스터링 인덱스 또한 굉장히 중요합니다. 속도면에서 타의 추종을 불허할 만큼 중요한 기능이기 때문입니다. DBMS에서 Datawarehouse 란 용어와 MART라는 용어를 들어보셨을 것입니다. 이 Database를 구축할때 반드시 클러스터링 인덱스를 쓸것을 권고하고 있습니다. 그만큼 중요한 내용이기도 합니다. 이 클러스터링 인덱스는 /* 위의 내용 읽기 */ 이 클러스터링 인덱스가 DML로 인해 손상이 가는 경우는 더러 데이터를 인위적으로 빼놓았다가 다시 입력하는 경우도 있습니다. 이 작업을 스케줄링으로 걸어 테이블의 데이터를 비워내고 다시 입력해주는 작업을 주기적으로 하는 고객사도 있습니다.
  55. 클러스터링 인덱스 구성 모습입니다. 클러스터링 인덱스는 그림에서와 같이 다른게 아니라 순차적으로 데이터가 배열 되어 있다는 것입니다. 그래서 검색을 할때도 순서대로 되어 있기때문에 임의의 연산을 가해도 바로 검색이 가능하다는 장점이 생기는 것입니다. 그렇기에 옵티마이저에서도 연산에 대한 부담이 없이 바로바로 데이터 처리가 가능한 것입니다.
  56. 클러스터링 인덱스를 만드는 방법입니다. DBMS마다 틀리긴 하지만 다음과 같은 문법으로 만듭니다. /* 내용 읽기 */
  57. 프리머리 키와 대응되는 키가 또 하나 있습니다. 아시다시피 바로 Unique Index 입니다. 이 유니크 인덱스는 인덱스의 기능외에 하나 더 기능을 하고 있습니다. 바로 프리머리키와 마찬가지로 데이터의 유일성을 체크한다는 것입니다. 하지만 Primary Key와 Unique Key는 분명히 차이가 큽니다. Primary Key는 테이블에 대표로 되는 Key로써 다른 테이블과 연관관계가 큰 컬럼입니다. 즉 한 테이블에 대표로서 사용되어 지는 Key라고 할 수 있습니다. 하지만 Unique Key는 한 테이블에 여러개 사용될 수 있습니다. 즉 테이블내에 유일한 데이터로만 판별할 수 있는 Key라고 볼 수 있겠습니다. Primary Key = Not Null + Unique Key로 생각하시는 분들이 있는데 비슷하지만 절대 아님을 강조드립니다.
  58. Unique Key는 일반 인덱스 생성방법과 비슷합니다. CREATE 문법으로 만들고 원하는 컬럼을 선택해 주시면 됩니다.
  59. 인덱스를 생성할때 이런 고민들을 해보신 적이 있으실 겁니다. Where 조건에 간간히 검색용도로 들어오는 컬럼이 있습니다. 그런데 어쩌다 한번 사용이 되기는 하지만 이 컬럼이 있음으로 해서 성능이 좀 더 나오기도 합니다. 하지만 잘 사용되지 않기에 인덱스를 생성할 때 넣을지 말지 고민이 됩니다. 이때 사용되는것이 바로 Include옵션인 것입니다. 지금부터 이 Include옵션에 대해 알아보도록 하겠습니다.
  60. 일반적으로 인덱스를 생성시 복합 입덱스, 즉 컬럼을 2-3개 이상씩 넣어서 인덱스를 생성하실 겁니다. 그런데 이 컬럼의 속성에 따라서 인덱스를 생성시 깊이가 크게 될수가 있습니다. 인덱스의 깊이가 크게 된다는건 그만큼 DBMS의 검색 경로가 길게 된다는 얘기가 됩니다. 그만큼 디스크 용량이 추가로 더 많이 들어가게 된다는 것이지만 문제는 이것의 부작용으로 DBMS의 연산이 늘어난다는 것입니다. 이것은 그만큼 속도가 느려진다는 반증이 되기도 하며 추후 문제가 되기도 합니다.
  61. 이때 Inlcude 옵션을 사용하면 장점을 얻을 수 있습니다. /* 위의 내용 읽기 */
  62. 인덱스를 생성했다면 그에 따른 유지보수가 따릅니다. 그 내용은들은 다음과 같습니다. 한 테이블당 인덱스 갯수는 일반적으로 5개 미만으로 가지고 있기를 추천합니다. 인덱스를 많이 가지고 있다고 해서 좋은것이 아닙니다. 인덱스 갯수가 많은 만큼 옵티마이저는 인덱스를 이용해서 계산을 해야 하기 때문에 요청한 SQL에 맞는 인덱스를 찾아야 하기때문에 그만큼 추가 연산이 들어가게 됩니다. 그래서 필요없는 인덱스는 제거해 주는것이 유리합니다. 자 이곳에 또하나의 문제가 있습니다. 인덱스는 1번 또는 2번 중에 어떤것만 있으면 될까요? /* 위의 질문 내용 읽기 */ 정답은 2번만 있으면 됩니다. Where 조건에 SEQ는 무조건 들어간다는 전제 하에 2번만 있으면 모든 인덱스가 커버가 되기 때문에 중복으로 만들 필요가 없습니다. 중복으로 인덱스를 만들면 관리가 어려울 뿐더러 디스크 낭비가 심해지기도 합니다. 가끔씩 보면 데이터 크기보다 인덱스 크기가 2-3배 많은 곳도 종종 볼수가 있는데 대부분 인덱스를 효율적으로 관리하고 있지 못하다는 증거가 바로 이것입니다.
  63. 마스터 테이블은 가능하면 Clustering Index로 만드실것을 권고 드립니다. 기준이 되는 테이블에 데이터가 많다면 클러스터링 인덱스로 생성시 월등히 빠른 성능을 경험하실 수 있습니다. 그러나 만약 DML이 너무 자주 일어나서 클러스터링 비율이 낮추어 졌다면 다시 재생성하시기를 권고 드립니다. 클러스터링 비율이 낮으면 낮을 수록 일반 인덱스보다 못한 효율이 나올 수도 있기 때문입니다. 클러스터링 인덱스는 일반 인덱스와 특성이 틀리기 때문에 클러스터링 비율이 굉장히 중요합니다. 일반 인덱스도 마찬가지 입니다. 인덱스가 DML때문에 Leaf노드가 많이 생겨나고 데이터의 일관성이 떨어지면 인덱스 검색시 효율이 떨어지게 됩니다. 그래서 일정 기간을 두고 인덱스 리빌드라고 하여 인덱스를 재생성하는 과정을 거치기도 합니다. 이 인덱스 재생성만으로도 10% 이상의 성능을 나타내는 경우도 더러 있기도 합니다.
  64. 롭 컬럼은 일반적인 데이터 형식의 컬럼으로 수용이 되지 않고 많은 양의 공간이 필요할 때 LOB컬럼을 이용합니다. 이미지, 음악데이터, 지도데이터 등등 많은 용도로 이용되고 있습니다.
  65. 이 LOB은 일반데이터와는 다르게 특수하게 운용이 됩니다. LOB 데이터는 Buffer Pool을 거치지 않고 사용자에게 바로 Return 됩니다. 이런 이유로 LOB데이터 있는 컬럼은 사용자에게 늦게 Return이 됩니다. 이걸 피하기 위해 VARCHAR를 가능한 크게 하는 방법으로 하게 되나 이 방법은 효율적으로 운영되지 못하는 단점이 있음. 그럼 좀더 큰 데이터를 메모리 캐시에 올려 빨리 올리는 방법은 무엇일까요???
  66. 바로 INLINE LOB을 이용하는 방법입니다. 바로 INLINE Lob을 이용하면 Buffer Pool에서 데이터를 사용자에게 직접 리턴하게 되기 때문에 성능면에서 많이 개선되게 됩니다. 어느정도의 데이터를 빠르게 리턴받고 싶고 메모리에 등록해서 사용하고 싶을때 바로 이방법을 이용하시면 됩니다.
  67. 메모리 정리가 자주 일어난다는 말은 사용자가 자주 사용되는 Row가 우선순위에서 밀려날 수가 있다는 얘기가 됨
  68. 이것으로 제 강의를 마치겠습니다. 많이 부족합니다. 하지만 포기하지 않고~~~