PostgreSQL

PostgreSQL: ctid

dewstream 2025. 11. 7. 08:00
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