본문 바로가기

PostgreSQL

(17)
액세스 방식 Seq Scan 방식 ▪ Seq Scan은 테이블을 Full Scan 하면서 레코드를 읽는 방식이다. ▪ 인덱스가 존재하지 않거나, 인덱스가 존재하더라도 읽어야 할 범위가 넓은 경우에 선택한다. Index Scan 방식 ▪ Index Scan은 인덱스 Leaf 블록에 저장된 키를 이용해서 테이블 레코드를 액세스하는 방식이다. ▪ 인덱스 키 순서대로 출력된다. ▪ 레코드 정렬 상태에 따라서 테이블 블록 액세스 횟수가 크게 차이 난다. Bitmap Index Scan 방식 ▪ 테이블 랜덤 액세스 횟수를 줄이기 위해 고안된 방식이다. ▪ Index Scan 방식과 Bitmap Index Scan 방식을 결정하는 기준은 인덱스 칼럼의 Correlation 값이다. ▪ Correlation이란 인덱스 칼럼에 대한..
Explain Explain 사용 모드 ▪ Explain은 크게 2가지 모드로 사용할 수 있다. 1) 예측 모드: 실제 수행은 하지 않고 예상 실행 계획을 제공한다. 2) 실행 모드: 실제 수행을 한 후에 실행 계획, 수행 시간, IO 블록 수를 제공한다. ▪ 예측 모드 사용법 explain select * from t2; QUERY PLAN -------------------------------------------------------------- Seq Scan on t2 (cost=0.00..18334.00 rows=1000000 width=37) • 쿼리 앞에 explain 키워드만 추가하면 된다. • 통계 정보를 참고해서 COST, 예상 ROWS, 칼럼 길이 정보를 제공한다. ▪ 실행 모드 사용법 expl..
COST 계산에 이용되는 파라미터 / 통계 정보 IO 비용 계산을 위한 파라미터 ▪ seq_page_cost ✓ Seq Scan 방식으로 1 블록을 읽는 비용 ▪ random_page_cost ✓ Index Scan 방식으로 1 블록을 읽는 비용 ✓ 인덱스 Root 블록과 Branch 블록을 제외 CPU 비용 계산을 위한 파라미터 ▪ cpu_tuple_cost ✓ Seq Scan 수행 시에 1개 레코드를 액세스하는 비용 ▪ cpu_index_tuple_cost ✓ Index Scan 수행 시에 1개 레코드를 액세스하는 비용 ▪ cpu_operator_cost ✓ 레코드 1개를 필터 처리하는 비용 Seq Scan 비용 계산 ✓ 매우 단순한 방식으로 계산함 COST= SELECT relpages * current_setting('seq_page_cost'..
HOT (Heap Only Tuple) HOT (Heap Only Tuple) ▪ HOT는 PostgreSQL MVCC 모델의 약점을 극복하기 위한 튜닝 기법이다. ▪ HOT는 ‘테이블에만 존재하는 레코드’ 란 의미이다. ▪ 풀어서 말하면, 인덱스에는 존재하지 않고 테이블에만 존재하는 레코드라는 뜻이다. ▪ HOT는 변경 후의 레코드가 동일 블록에 저장될 때만 동작한다. ▪ 따라서 변경이 빈번한 테이블은 반드시 FILLFACTOR를 작게 설정해야 한다.
Vacuum, Auto Vacuum Vacuum의 목적 ▪ 공간 재활용 1) 오래된 이전 버전 레코드 삭제 작업을 통한 공간 확보 (Vacuum) 2) 오래된 이전 버전 레코드 삭제 작업 후에 공간 압축 (Vacuum Full) ▪ XID Frozen ✓ Vacuum 수행 시에 필요한 레코드에 대해서 수행됨 ✓ Anti-Wraparound Vacuum이라고 함 ▪ Vacuum은 DML과 호환된다. ▪ Vacuum Full은 DML 뿐 아니라 SELECT와도 호환되지 않는다. (PG_REPACK 익스텐션 고려) Autovacuum이 하는 일 1) 데이터 변경에 따른 자동 통계 수집 2) XID 증가에 따른 Anti-Wraparound Vacuum 수행 9.6 버전부터 Anti-Wraparound Vacuum 문제가 해결됨 ▪ Visibili..
MVCC (다중 버전 읽기 일관성) MVCC MVCC (Multi-Version Concurrency Control)는 쿼리 수행 시점의 데이터를 제공하는 기법이다. ▪ 이를 위해서는 변경 후의 현재 데이터 (Current Data) 뿐 아니라, 변경 전의 이전 데이터 (Before Data)를 읽을 수 있어야 한다. PostgreSQL MVCC의 특징 ▪ 특징-1. 이전 버전의 데이터를 테이블 블록 내에 저장한다. 1) 이 특징은 MVCC를 매우 단순하게 구현할 수 있다는 장점이 있다. 2) 하지만 ‘이전 데이터’를 블록 내에 저장함으로써 테이블의 공간 사용 효율이 떨어진다는 단점이 있다. 3) 이 단점을 해결하기 위해서 Vacuum이 필요하다. 4) Vacuum을 수행하면 불필요한 데이터가 삭제된다. 5) Vacuum Full을 수행하..
Shared Buffer Tuning Shared Buffer의 목적은 DISK IO를 최소화함으로써 IO 성능을 향상하는 것이다. 1) 매우 큰 (수십, 수백 GB) 버퍼를 빠르게 액세스해야 한다. 2) 많은 사용자가 동시에 접근할 때 경합을 최소화해야 한다. 3) 자주 사용되는 블록은 최대한 오랫동안 버퍼 내에 있어야 한다. Shared Buffer의 구조는 크게 1) 해시 테이블 2) 해시 엘리먼트 3) 버퍼 디스크립터 4) 버퍼 풀 로 구성된다. Buffer Replacement를 위한 Clock Sweep 알고리즘 ▪ Clock Sweep 알고리즘은 덜 사용된 버퍼를 Victim 버퍼로 선정하는 알고리즘으로써 ▪ NFU (Not Frequently Used) 알고리즘의 일종이다. ▪ 버퍼가 액세스될 때마다 usage_count를 1..
PostgreSQL 아키텍처 PostgreSQL 아키텍처 - PostgreSQL 아키텍처는 매우 단순하다. - 공유 메모리, 매우 적은 수의 백그라운드 프로세스와 데이터파일로 구성된다. - PostgreSQL은 SQL 공유를 위한 Pool이 없다. - PostgreSQL은 세션 레벨의 Plan Caching 기능을 제공한다. 이를 이용한 prepare Stmt 수행 구조도는 다음과 같다.