설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


총 게시물 94건, 최근 0 건
   

오라클의 ROWID

글쓴이 : PostgresDBA 날짜 : 2012-12-17 (월) 16:22 조회 : 7837
PostgreSQL 에 오라클의 rowid 가상 컬럼에 해당하는게 무엇일가요?
바로 CTID 요놈입니다.

CTID 는 테이블 내부 행 버전의 물리적 위치를 나타냅니다. 오라클의 ROWID 처럼 행을 빠르게 찾기 위해 사용할 수 있지만 행 CTID 값은 지속성을 가지고 있지 않으므로, 값이 바뀔수 있으므로 주의해야 합니다.

아래는 CTID 가상 컬럼을 조회한 예입니다.

scott@[local]:5432 scottdb#SQL> select ctid, ename from emp;
  ctid  | ename  
--------+--------
 (0,1)  | SMITH
 (0,2)  | ALLEN
 (0,3)  | WARD
 (0,4)  | JONES
 (0,5)  | MARTIN
 (0,6)  | BLAKE
 (0,7)  | CLARK
 (0,8)  | SCOTT
 (0,9)  | KING
 (0,10) | TURNER
 (0,11) | ADAMS
 (0,12) | JAMES
 (0,13) | FORD
 (0,14) | MILLER
(14 rows)

Time: 161.787 ms
scott@[local]:5432 scottdb#SQL> 

오라클에서 임의의 행 하나를 삭제하는
SQL> DELETE EMP WHERE ROWMUM=1 
쿼리를 PostgreSQL 에서 어떻게 구현할수 있을까요?

SQL> DELETE FROM EMP LIMIT 1 아쉽게도 이렇게는 안됩니다.(syntax error)

이때 CTID 를 활용할수 있습니다. 아래처럼.

DELETE FROM EMP WHERE CTID IN (SELECT CTID FROM EMP LIMIT 1);





PostgresDBA 2018-01-02 (화) 18:16
오라클에서 rowid 를 query 에서 쓰는걸 권장하지 않는 것처럼 postgresql 도 마찬가지입니다.

특히나 partition 테이블에서는 select ctid from 모테이블; 이렇게하면 ctid 가 중복된것 처럼 보입니다.
child 마다 ctid 는 다르겠지만 모테이블에서는 차일드 테이블을 병합해서 보여주니 중복되는걸로 보입니다.
주의하세요~
댓글주소
   

postgresdba.com