728x90
※ PostgreSQL: ctid.
안녕하세요. 듀스트림입니다.
오늘 포스팅은 지난 포스팅과 연계되는 내용으로 시스템 컬럼인 ctid에 대해 알아보겠습니다.
5.6. System Columns
5.6. System Columns # Every table has several system columns that are implicitly defined by the system. Therefore, these names cannot …
www.postgresql.org
1. ctid?
- ctid는 PostgreSQL의 각 행(Row) 에 대해 자동으로 부여되는 물리적 위치 식별자입니다.
- ctid는 해당 튜플이 테이블 파일 내에서 어느 블록의 몇 번째에 저장되어 있는지를 나타내는 시스템 컬럼으로, 다음과 같은 형식을 가집니다:
ctid = (block_number, tuple_index)
-- SELECT에 ctid 컬럼 명시로 확인할 수 있습니다.
SELECT ctid, * FROM table_name;
2. ctid 주요 특징 요약
| 항목 | 설명 |
| 정의 | Tuple의 물리적 위치(= 블록 번호 + 오프셋)를 나타내는 시스템 컬럼 |
| 형식 | (block_number, offset) → TID라고도 함 |
| 자동 생성 | 테이블마다 자동으로 생성되며, 사용자가 명시적으로 정의할 수 없음 |
| 용도 | 특정 튜플의 정확한 위치를 지정할 때 사용됨 (예: 빠른 UPDATE/DELETE) |
| MVCC 영향 | UPDATE 시 새로운 버전 튜플이 생성되므로 ctid가 변경됨 |
| 인덱스 아님 | ctid는 인덱스가 아니라 위치 표시자지만, 내부적으로 인덱스 루핑 시 참조됨 |
▸ ctid를 이용한 빠른 UPDATE
-- 1. ctid를 확인
SELECT ctid, * FROM users WHERE user_id = 123;
-- 2. ctid로 직접 업데이트
UPDATE users SET name = '퐁듀' WHERE ctid = '(42,3)';
→ 이 방식은 인덱스를 통한 탐색 없이 물리적 위치로 바로 접근하므로 빠릅니다. (단, MVCC 때문에 기존 튜플은 죽은 튜플이 되고 새 튜플이 다른 ctid로 재삽입됩니다.)
3. 주의사항
| 항목 | 설명 |
| 불변 아님 | ctid는 업데이트 시 변경됨 (튜플 복사본 생성 → MVCC) |
| 인덱스 대체 불가 | 특정 쿼리에선 빠르지만, 일반적인 검색용 인덱스로는 부적합 |
| VACUUM 영향 | VACUUM FULL은 테이블 재작성하므로 ctid가 전체 변경될 수 있음 |
+ 관련 포스팅
PostgreSQL: HOT(Heap-Only Tuple)
※ PostgreSQL: HOT(Heap-Only Tuple). 안녕하세요. 듀스트림입니다. 오늘 포스팅은 PosgreSQL 8.3 버전부터 도입된 HOT에 대한 내용입니다. 참고로 저는 HOT 세대입니다.1. PostgreSQL의 MVCC 업데이트 비용과 HOT의
dewstream.tistory.com
https://dewstream.tistory.com/176
오늘은 여기까지~
728x90
'PostgreSQL' 카테고리의 다른 글
| PostgreSQL: 스트리밍 복제 지연 (0) | 2025.11.12 |
|---|---|
| PostgreSQL: never executed (0) | 2025.11.10 |
| PostgreSQL: Heap Table Structure (0) | 2025.11.05 |
| PostgreSQL: Heap Fetch (0) | 2025.11.03 |
| PostgreSQL: ALTER TABLE ... (0) | 2025.10.31 |