오라클은 rowid라고 인덱스에 해당 값이 존재하는데요
postgresql도 비슷한게 ctid라고 존재한다고 여러 글에서 봤습니다
하지만 ctid는 인덱스가 아닌 테이블에 존재하는거 같은데요
postgresql 에서도 오라클 같이 인덱스에 존재하는 rowid 같은 것이 존재 하나요?
그 테이블의 ctid 값이 인덱스의 자료 위치 값으로 사용됩니다. 당연히 테이블의 ctid 를 참조해야 인덱스 탐색 결과 그 테이블의 자료를 찾을 수 있겠죠.
자세한 것은 pageinspect 확장 모듈의 bt_page_items() 함수를 이용해서 살펴볼 수 있습니다.
postgres@postgres=# select ctid,* from tt; ctid | a | b --------+---+--- (0,6) | 1 | 1 (0,7) | 1 | 1 (0,8) | 1 | 1 (0,9) | 3 | (0,10) | 2 | (0,11) | 3 | (0,12) | 4 | (0,13) | 5 | (8개 행) postgres@postgres=# create index tt_a_i on tt (a); CREATE INDEX postgres@postgres=# select * from bt_page_items('tt_a_i',1); itemoffset | ctid | itemlen | nulls | vars | data ------------+-------+---------+-------+------+------------------------- 1 | (0,6) | 16 | f | f | 01 00 00 00 00 00 00 00 2 | (0,7) | 16 | f | f | 01 00 00 00 00 00 00 00 3 | (0,8) | 16 | f | f | 01 00 00 00 00 00 00 00 4 | (0,2) | 16 | f | f | 02 00 00 00 00 00 00 00 5 | (0,1) | 16 | f | f | 03 00 00 00 00 00 00 00 6 | (0,3) | 16 | f | f | 03 00 00 00 00 00 00 00 7 | (0,4) | 16 | f | f | 04 00 00 00 00 00 00 00 8 | (0,5) | 16 | f | f | 05 00 00 00 00 00 00 00 (8개 행)
ctid 가 rowid 랑 비슷한 개념이기는 하나
update 되도 변경이 되고,
파티션테이블에서는 중복되니 오라클의 rowid 처럼
함부로 쓰면 안됩니다.