ORACLE의 ROWID 구성과

📌 ORACLE의 ROWID 구성

ROWID는 Oracle에서 각 행(Row) 을 고유하게 식별하는 물리적 주소입니다.
이 값은 테이블 내에서 각 행의 위치를 나타내며, 16진수 문자열 형태로 표시됩니다.

📌 ROWID의 기본 형식

ROWID = OOOOOOFFFBBBBBBRRR

각 부분의 의미는 다음과 같습니다:

구성 요소 길이(비트) 설명
Object ID (OOOOOO) 32비트 테이블 또는 클러스터의 객체 번호
File Number (FFF) 10비트 행이 저장된 데이터 파일 번호
Block Number (BBBBBB) 22비트 데이터 파일 내 블록 번호
Row Number (RRR) 16비트 블록 내 행 번호

Oracle에서 ROWIDBase64 형태로 인코딩된 18자리 문자열로 표현됩니다.


📌 ROWID 예제

ROWID 조회

SELECT ROWID, EMPLOYEE_ID, LAST_NAME 
FROM EMPLOYEES
WHERE ROWNUM <= 5;

결과 예시

ROWID              EMPLOYEE_ID  LAST_NAME
------------------ ------------ ----------
AAAB12AADAAAAUjAAA        100    King
AAAB12AADAAAAUjAAB        101    Kochhar
AAAB12AADAAAAUjAAC        102    De Haan
AAAB12AADAAAAUjAAD        103    Hunold
AAAB12AADAAAAUjAAE        104    Ernst

📌 ROWID 디코딩 예제

Oracle에서 DBMS_ROWID 패키지를 사용하면 ROWID를 분석할 수 있습니다.

SELECT 
    ROWID, 
    DBMS_ROWID.ROWID_OBJECT(ROWID) AS OBJECT_ID,  -- 테이블의 객체 ID
    DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS FILE_NO, -- 데이터 파일 번호
    DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS BLOCK_NO, -- 블록 번호
    DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) AS ROW_NO -- 블록 내 행 번호
FROM EMPLOYEES
WHERE ROWNUM = 1;

결과 예시

ROWID             OBJECT_ID FILE_NO BLOCK_NO ROW_NO
----------------- --------- ------- -------- ------
AAAB12AADAAAAUjAAA   12345      4      1357    2
  • OBJECT_ID = 12345 → EMPLOYEES 테이블의 객체 ID
  • FILE_NO = 4 → 데이터 파일 번호
  • BLOCK_NO = 1357 → 해당 데이터가 저장된 블록 번호
  • ROW_NO = 2 → 블록 내 2번째 행

📌 ROWID의 활용

1️⃣ 행을 고유하게 식별

  • ROWID는 각 행의 물리적 위치를 나타내므로, 고유한 키 역할을 할 수 있음.
  • 하지만, ROWID는 테이블 리오그(재구성) 또는 인덱스 리빌드 후 변경될 수 있음.

2️⃣ 빠른 데이터 조회 (ROWID 기반 접근)

  • ROWID는 인덱스를 거치지 않고 직접 행을 조회하기 때문에 성능이 매우 빠름.
  • 예제:
    sql
    SELECT * FROM EMPLOYEES WHERE ROWID = 'AAAB12AADAAAAUjAAA';

3️⃣ 중복 제거 및 특정 행 삭제

  • 중복 데이터가 존재할 때 ROWID를 활용하면 개별 행을 삭제할 수 있음.
  • 예제: 중복된 LAST_NAME을 하나만 남기고 삭제
    sql
    DELETE FROM EMPLOYEES
    WHERE ROWID NOT IN (
    SELECT MIN(ROWID)
    FROM EMPLOYEES
    GROUP BY LAST_NAME
    );

📌 ROWID vs ROWNUM 차이점

비교 항목 ROWID ROWNUM
의미 행의 물리적 주소 결과 집합에서 행의 논리적 번호
값의 고유성 테이블 내에서 고유 실행 계획에 따라 변할 수 있음
변경 가능성 테이블 재구성 시 변경될 수 있음 쿼리 실행 방식에 따라 변경됨
성능 인덱스 없이 빠르게 조회 가능 쿼리 실행 방식에 따라 성능이 달라짐

📌 정리

  • ROWID는 행의 물리적 주소이며, 테이블 내에서 각 행을 고유하게 식별하는 값.
  • OBJECT_ID + FILE_NO + BLOCK_NO + ROW_NO 로 구성됨.
  • DBMS_ROWID 패키지를 사용하면 ROWID를 해석 가능.
  • 빠른 조회 및 중복 데이터 정리에 유용하지만, 테이블 구조 변경 시 값이 변경될 수 있음.

➡ ROWID를 직접 PK로 사용하지는 않지만, 성능 최적화나 특정 행을 고유 식별할 때 유용하게 활용할 수 있음! 🚀

2025-04-27-oracle-rowid_cover


게시됨

카테고리

작성자

태그:

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다