Download - 제 7회 엑셈 수요 세미나 자료 연구컨텐츠팀
Table of Agenda
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
01.
02.
03.
[PostgreSQL] Vacuum의 거의 모든 것 (3차)
[MySQL] Page와 Undo page deep internal 분석
[MySQL] Hint 사용법
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
01. [PostgreSQL] Vacuum의 거의 모든 것 (3차)
발표자: 연구컨텐츠팀 김숙진
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
목차
1차
1) Vacuum 정의 및 필요성2) Vacuum 실행 구조3) 표준 Vacuum VS Vacuum full (시나리오)
2차
1) dump로 보는 “표준 Vacuum VS Vacuum full”
[PostgreSQL] Vacuum의 거의 모든 것
3차
1) XID wraparound and freezing tuple2) Autovacuum
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
• 트랜잭션에 대한 MVCC 기법: XID(트랜잭션 ID)를 숫자로 처리하고 비교
• 232 까지 표현이 가능 (대략 40억)
• 40억 트랜잭션: 옛 XID(20억) + 새 XID(20억)
• 옛 XID 20억은 보이고, 새 XID 20억은 안보이게 처리
• 계속 순환하면서 사용
출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid
새 XID(20억)
옛 XID(20억)
Visible
( Invisible )
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
• XID wraparound 때문에 오래된 데이터에 대한 손실 발생
• Insert–only 테이블에서만 발생
출처: http://www.slideshare.net/hadoopxnttdata/postgresql-xid-wraparound-another-issue
과거(visible)
미래(invisible)
Visible Visible Invisible
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
• 튜플을 “FREEZE”로 표시하고, 이 FrozenXID는 일반 XID 비교 대상에서 항상 제외되어 항상 보여짐
• 20억 트랜잭션이 생기기 전에 FrozenXID 즉, 영구 보관용 자료로 변경하면 XID 겹침 오류 방지
• 이러한 변경 작업(data freezing)은 VACUUM FREEZE 명령으로 처리
출처: http://www.slideshare.net/hadoopxnttdata/postgresql-xid-wraparound-another-issue
과거(visible)
미래(invisible)
Visible VisibleVisible
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
Skip 되는 블록
pg_class 테이블의 relfrozenxid 칼럼값 :VACUUM 작업으로 그 테이블 전체에 대해서XID 정리 작업을 했던 트랜잭션 ID 값
출처: http://www.slideshare.net/hadoopxnttdata/postgresql-xid-wraparound-another-issue
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid
20억
2억
1.5억
autovacuum 데몬에 의해 강제로 테이블의모든 페이지를 조사해서 트랜잭션 ID 겹침오류를 방지
• Table age가 (vacuum_freeze_table_age – vacuum_freeze_min_age)보다 크면, 모든 페이지를 검사해서
변경 작업을 진행
VACUUM 작업에서 모든 페이지를 대상으로 이 XID 변경 작업을 할 것인지 결정가능
0으로 지정하면, VM 확인하지 않고 항상모든 페이지 검사
최대값: autovacuum_freeze_max_age* 0.95
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid
20억
2억
1.5억
이 시점에서는 표준 VACUUM이 실행됨
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid
20억
2억
1.5억
이 시점에서 VACUUM 작업을 하면
anti-wraparound VACUUM이 실행됨
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
1. XID Wraparound and Freezing Tuple
FrozenXID로 바꾸기 전 옛 XID를
얼마나 남길 것인가 지정
anti-wraparound VACUUM 후에는
relfrozenxid 값이 업데이트됨
출처: http://www.slideshare.net/pgdayasia/introduction-to-vacuum-freezing-and-xid
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
20억
2억
1.5억
1. XID Wraparound and Freezing Tuple
• 한 테이블이 vacuum 작업 없이 계속 트랜잭션 작업할 수 있는 간격
: 마지막 vacuum 이후부터, 20억 – vacuum_freeze_min_age 값만큼의 트랜잭션
• 트랜잭션 발생, vacuum 작업 없다면 데이터 손실
Autovacuum 기능을 사용하지 않더라도, autovacuum_freeze_max_age 지정 간격으로 vacuum 작업 진행
• 한 테이블에 대해 vacuum 작업이 한번도 하지 않았다면, (Autovacuum_freeze_max_age –
vacuum_freeze_min_age) 값 만큼의 트랜잭션 발생 시, autovacuum 자동 진행
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
2. Autovacuum
Autovacuum launcherAutovacuum_naptime 값으로 지정한 초 간격으로 한 번에 하나의 데이터베이스를 작업할 수 있도록 worker 프로세스의 실행 시간을 관리
Autovacuum workersAutovacuum_max_workers worker 프로세스 최대 개수
AUTOVACUUM이란? VACUUM 명령과 ANALYZE 명령을 주기적으로 자동 실행
• 주기적인 표준 Vacuum 작업을 하여 빈 공간을 확보하여 최대한 Vacuum Full 작업을 방지
• 최소의 디스크를 쓰는 것이 아닌 최적의 디스크 공간만 사용
출처: http://www.slideshare.net/alexeylesovsky/deep-dive-into-postgresql-statistics-60849690
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
2. Autovacuum
• Autovacuum 데몬은 이러한 예상치 못한 상황에 대해 자동으로 Vacuum 작업을 진행하여 위와 같은 문제를 피할 수 있음
• 정확한 데이터베이스 사용량을 파악하지 않고 autovacuum을 끄면 안됨
• Autovacuum 데몬을 사용하지 않는다면, 해당 DB 서버에서 사용하고 있는 모든 DB에 대해서 Vacuum 작업을 해야 함
• Autovacuum 데몬은 테이블 자료 추가/변경/삭제 된 경우, 무조건 작업의 고려 대상으로 판단 (임시 테이블은 대상에서 제외)
Vacuum 작업은내가 직접 작업량이적은 밤 시간에 주기적으로 해야지!
갑자기 변경이 많은 작업 발생 최악의 경우, Vacuum Full
DBA
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
2. Autovacuum
autovacuum_naptimeautovacuum 데몬에 대한 “activity rounds”간격 즉, autovacuum 데몬이 한번 작업하고, 쉬는 시간 (기본 값 1분 – 초(秒)로 설정)
autovacuum_vacuum_threshold / autovacuum_analyze_threshold한 테이블 내에서 업데이트/삭제된 튜플이 설정 값만큼 된다면 VACUUM/ANAYLZE 작업하는 수행, 작업 시작할 최소 변경 수 (기본 값 50)
autovacuum_freeze_max_age한 테이블 내에서 마지막 vacuum 작업으로 pg_class.relfrozenxid 값이 지정된 뒤로, 이 설정 값보다 더 커지면 vacuum 작업 수행
autovacuum_vacuum_cost_delayautovacuum 데몬의 초과 비용 사용시, 멈추는 최대 시간
autovacuum_vacuum_cost_limitautovacuum 데몬이 사용할 수 있는 최대 비용
autovacuum_vacuum_scale_factor한 테이블 내에서 autovacuum_vacuum_threshold 값이 초과되어 vacuum 작업을 시작하려고 할 때, 추가적으로 테이블 크기의 변화량 (기본값은 0.2 = 테이블 크기의 20%)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Autovacuum이 작업하는 기준
2. Autovacuum
1. 테이블 나이가 autovacuum_freeze_max_age 설정으로 지정한 트랜잭션 수보다 많다면, 그 테이블은 무조건 Vacuum 작업
* 테이블의 나이: relfrozenxid 칼럼 값을 age () 함수로 조사한 값
2. 테이블의 자료가 변경되어, Vacuum 임계치를 초과했다면, Vacuum 작업
* Vacuum 임계치 = Vacuum 초기 임계치 + Vacuum 배율값 * 튜플수
• Vacuum 초기 임계치: autovacuum_vacuum_threshold
• Vacuum 배율값: autovacuum_vacuum_scale_factor
• 튜플수: pg_class.reltuples
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
02. [MySQL] Page와 Undo page deep internal 분석
발표자: 연구컨텐츠팀 이근오
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Page와 Undo page deep internal 분석
Page의 기본구조
1개의 Page는 16 KB 구성
Page의 Header/Trailer 상세
1개의 Page는 16 KB 구성
Page 덤프
테이블(T1)의 파일 덤프
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Page와 Undo page deep internal 분석
Clustered indexes Page 상세 (1/2) Page 덤프
테이블(T1)의 파일 덤프
03 06 02 0e
00
00
00 10
00 30
50 50 31 30 31 30 20 …
00 00 00 af 06 22
bc 00 00 61 0c 01 10
41 20 41 20 …trx_id “af0622” hex값을 변환하면 11470370
The fields of the roll pointer structure are: 1-bit “is insert” flag, 7-bit rollback segment ID, 4-byte page number and 2-byte page offset of the undo log location.
create table exem_i.t1 ( c1 char(14), c2 char(2), c3 char(6), c4 char(3), primary key(c1) ) engine=innodb ;
create index t1_ix1 on exem_i.t1( c3,c4 ) ; Insert into t1 values (‘PP1010’,’A’,’A’,’A’) ; Insert into t1 values (‘PP1020’,’A’,’A’,’A’) ; Insert into t1 values (‘PP1030’,’A’,’A’,’A’) ;
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Page와 Undo page deep internal 분석
Clustered indexes Page 상세 (2/2) Page 덤프
테이블(T1)의 파일 덤프 PK인덱스로 구성된 테이블의 Page 상세구조 Infimum 포인트에서 시작해서 Next Offset 값으로
연결된 구조
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Page와 Undo page deep internal 분석
Secondary indexes Page 상세 Page 덤프
테이블(T1) 의 파일에서 인덱스페이지 덤프 Non-PK 인덱스의 Page 상세구조 Clustered indexes 페이지와 비슷한 구조로 Infimum
포인트에서 시작해서 Next Offset 값으로 연결된 구조 오라클의 rowid 값 역할을 PK 컬럼이 대신한다.
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Hint 사용법
분류 힌트명 설명 용법
• 5.7.7부터 출시된 힌트들
• 이전 버전에서는optimizer_switch변수로 설정을 했지만 쿼리단위로설정을 할 수는 없었음
BKABatched Key Access join수행여부
/*+ BKA(@qb|table) */
NO_BKA /*+ NO_BKA(@qb|table) */
BNLBlock Nested-Loop join수행여부
/*+ BNL(@qb|table) */
NO_BNL /*+ NO_BNL(@qb|table) */
MRRMulti-Range Read 오퍼레이션 수행여부
/*+ MRR(table|index) */
NO_MRR /*+ NO_MRR(table|index) */
MAX_EXECUTION_TIME SELECT 수행시간에 제한을 둠 (N milliseconds) /*+ MAX_EXECUTION_TIME(n) */
NO_ICP Index Condition Pushdown오퍼레이션이 수행안되게 함 /*+ NO_ICP(table|index) */
NO_RANGE_OPTIMIZATIONRange 스캔을 사용하지 못하게 함 해당 힌트 사용시 인덱스Merge나 Loose 인덱스 스캔도 불가능
/*+ NO_RANGE_OPTIMIZATION(table|index) */
QB_NAME 쿼리블록에 이름을 할당함 /*+ QB_NAME(qbname) */
SEMIJOIN세미조인전략 지정 및 사용여부 (DUPSWEEDOUT, FIRSTMATCH, LOOSESCAN, MATERIALIZATION)
/*+ SEMIJOIN(@qb strategy) */
NO_SEMIJOIN/*+ NO_SEMIJOIN(@qb strategy) */
SUBQUERY 서브쿼리전략 지정(INTOEXISTS, MATERIALIZATION) /*+ SUBQUERY(@qb strategy) */
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Hint 사용법
분류 힌트명 설명 용법
• 예약어중 힌트의 용도로 사용되는 것들
(http://dev.mysql.com/doc/refman/5.7/en/keywo
rds.html)
USE INDEX 사용할 인덱스를 선택USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
INGONRE INDEX 명시된 인덱스를 사용하지 않음IGNORE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
FORCE INDEX 사용할 인덱스를 강제로 선택FORCE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
STRAIGHT_JOIN 조인의 순서를 FROM절의 순서로 고정 SELECT STRAIGHT_JOIN ... FROM
SQL_SMALL_RESULT 옵티마이저가 결과가 '작을' 것이라고 알려줌 SELECT SQL_SMALL_RESULT ... FROM
SQL_BIG_RESULT 옵티마이저가 결과가 '클' 것이라고 알려줌 SELECT SQL_BIG_RESULT ... FROM
SQL_BUFFER_RESULT 결과를 임시테이블에 두며, 서브쿼리에서 사용불가 SELECT SQL_BUFFER_RESULT ... FROM
SQL_CACHE 쿼리를 쿼리캐시(query_cache_type=2)에 캐시함 SELECT SQL_CACHE ... FROM
SQL_NO_CACHE 쿼리를 쿼리캐시에 캐시하지 않음 SELECT SQL_NO_CACHE ... FROM
SQL_CALC_FOUND_ROWSLIMIT이 붙든 안붙든 모든 로우수를 계산시킴,FOUND_ROWS()함수로 조회가능.
SELECT SQL_CALC_FOUND_ROWS ... FROM
HIGH_PRIORITY 테이블락을 지원하는(ex. Myisam)스토리지 엔진에서 사용, 해당 힌트가 명시된 문장을 락 대기 큐에서의 우선순위를정함,
SELECT HIFH_PRIORITY ... FROM
LOW_PRIORITY SELECT LOW_PRIORITY ... FROM
DELAYED INSERT, REPLACE문장을 버퍼에 담아두고 한번에 처리 INSERT DELAYED INTO ...
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Hint 사용법
ignore index(key|index) 사용 예제
mysql> explain select * from employees.employees where emp_no<30000+----+-------------+-----------+------------+-------+---------------+---------+---------+------+-------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-----------+------------+-------+---------------+---------+---------+------+-------+----------+-------------+| 1 | SIMPLE | employees | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 39392 | 100.00 | Using where |+----+-------------+-----------+------------+-------+---------------+---------+---------+------+-------+----------+-------------+
mysql> explain select * from employees.employees ignore index(primary) where emp_no<30000;+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL| 299113 | 33.33 | Using where |+----+-------------+-----------+------------+------+---------------+------+---------+------+--------+----------+-------------+
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Hint 사용법
straight join 사용 예제
mysql> explain select * from employees,departments limit 1;+----+-------------+-------------+------------+-------+---------------+-----------+---------+------+--------+----------+---------------------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------+------------+-------+---------------+-----------+---------+------+--------+----------+---------------------------------------+| 1 | SIMPLE | departments | NULL | index | NULL | dept_name | 122 | NULL | 9 | 100.00 | Using index || 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299113 | 100.00 | Using join buffer (Block Nested Loop) |+----+-------------+-------------+------------+-------+---------------+-----------+---------+------+--------+----------+---------------------------------------+2 rows in set, 1 warning (0.00 sec)
mysql> explain select STRAIGHT_JOIN * from employees,departments limit 1;+----+-------------+-------------+------------+-------+---------------+-----------+---------+------+--------+----------+----------------------------------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------+------------+-------+---------------+-----------+---------+------+--------+----------+----------------------------------------------------+| 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299113 | 100.00 | NULL || 1 | SIMPLE | departments | NULL | index | NULL | dept_name | 122 | NULL | 9 | 100.00 | Using index; Using join buffer (Block Nested Loop) |+----+-------------+-------------+------------+-------+---------------+-----------+---------+------+--------+----------+----------------------------------------------------+2 rows in set, 1 warning (.00 sec)
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Hint 사용법
SQL_CACHE 사용 예제
mysql> select * from employees.employees limit 100000;mysql> show status like 'Qcache_inserts';+----------------+-------+| Variable_name | Value |+----------------+-------+| Qcache_inserts | 3 |+----------------+-------+mysql> select sql_cache * from employees.employees limit 100000;mysql> show status like 'Qcache_inserts';+----------------+-------+| Variable_name | Value |+----------------+-------+| Qcache_inserts | 4 |+----------------+-------+
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.
Hint 사용법
NO_BNL 사용예제mysql> explain select * from departments join employees limit 1;+----+-------------+-----------+------------+-------+---------------+-----------+---------+------+--------+----------+---------------------------------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-----------+------------+-------+---------------+-----------+---------+------+--------+----------+---------------------------------------+| 1 | SIMPLE | straight | NULL | index | NULL | dept_name | 122 | NULL | 9 | 100.00 | Using index || 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299113 | 100.00 | Using join buffer (Block Nested Loop) |+----+-------------+-----------+------------+-------+---------------+-----------+---------+------+--------+----------+---------------------------------------+
mysql> explain select /*+ no_bnl(employees) */ * from departments straight join employees limit 1;+----+-------------+-----------+------------+-------+---------------+-----------+---------+------+--------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-----------+------------+-------+---------------+-----------+---------+------+--------+----------+-------------+| 1 | SIMPLE | straight | NULL | index | NULL | dept_name | 122 | NULL | 9 | 100.00 | Using index || 1 | SIMPLE | employees | NULL | ALL | NULL | NULL | NULL | NULL | 299113 | 100.00 | NULL |+----+-------------+-----------+------------+-------+---------------+-----------+---------+------+--------+----------+-------------+
Research & Contents
Blog
Video
NAVER http://cafe.naver.com/playexem
ITPUB http://blog.itpub.net/31135309/
Wordpress https://playexem.wordpress.com/
Slideshare http://www.slideshare.net/playexem
Youtube https://www.youtube.com/channel/UC5wKR_-A0eL_Pn_EMzoauJg
Tudou http://www.tudou.com/home/maxgauge/
교육문의:연구컨텐츠팀김숙진
© Copyrights 2001~2016, EXEM CO.,LTD. All Rights Reserved.