권순용의 DB 이야기
ROWID 이용 0 0 2,970

by axiom ROWID [2015.10.18]


지난 시간에는 데이터베이스 내 데이터 공유 주소인 ROWID에 대해 살펴봤다. 이 글에서는 ROWID를 활용할 수 있는 세 가지 상황과 활용법을 알아본다.

ROWID는 데이터베이스 내부에서 이용되기도 하고, 개발자에 의해 SQL에서 이용되기도 한다. 인텍스 생성 시, 데이터 액세스 시, SQL 작성 시 이 세 가지 경우에 ROWID를 이용할 수 있다.

인덱스 생성 시

첫 번째로 인덱스 생성 시에 ROWID를 활용하는 방법을 살펴보자.

  • [그림1] 인덱스 생성 시 ROWID 활용 과정
  • ROWID 이용

EMP 테이블은 ENAME 컬럼으로 정렬돼 있지 않으면 추가(INSERT)된 순서에 의해 데이터가 저장되게 된다. 물론 EMP 테이블에는 별도의 ROWID 컬럼은 존재하지 않는다.

이런 상황에서 ENAME 컬럼에 인덱스를 생성하면 ENAME 컬럼의 값과 오라클이 내부적으로 가지고 있는 ENAME 컬럼의 ROWID가 추출된다. 다음 ENAME 컬럼으로 정렬하면서 <그림 1>처럼 인덱스를 생성하게 된다.

  • [그림2] 첫 번째 컬럼의 값이 동일하면 두 번째 컬럼 값으로 정렬 수행
  • ROWID 이용

인덱스의 구성 = 인덱스 Key 컬럼 값 + ROWID

동일한 ENAME 컬럼 값이 존재하면 해당 인덱스는 ROWID 컬럼으로 정렬해 인덱스를 생성한다. 그렇기 때문에 인덱스는 인덱스를 구성하는 첫 번째 컬럼에 의해 정렬을 수행한다.

만약 인덱스의 첫 번째 컬럼 값이 같으면 두 번째 컬럼의 값으로 정렬이 수행된다.

인덱스를 구성하는 모든 컬럼의 값이 동일할 경우 마지막에는 ROWID 값으로 정렬해 인덱스가 생성된다. 이는 자동 정렬을 이용하면서 목록 쿼리를 작성하는 경우에 이용 가능하다.

데이터 액세스 시

앞서 테이블 데이터를 통해 인덱스를 생성할 경우 ROWID를 이용하는 방법을 살펴봤다면 이번에는 인덱스 스캔(SCAN)을 활용한 데이터 액세스를 확인해 본다.

  • [리스트 1] SQL 문
  • SELECT ENAME, SAL 
      FROM EMP
     WHERE ENAME='ALLEN';
    

<리스트 1>처럼 SQL을 수행하면 <그림 3>처럼 내부적으로 수행돼 해당 SQL을 만족하는 결과를 추출할 수 있다.

  • [그림3] 데이터 액세스 시 ROWID 활용 과정
  • ROWID 이용

<그림 3>은 ENAME=’ALLEN’을 만족하는 테이블을 액세스해 ENAME 컬럼의 값과 SAL 컬럼 값을 추출하는 SQL이다.

① ENAME 인덱스를 스캔해 ENAME=’ALLEN’인 인덱스 값을 확인한다.

② ①단계에서 확인한 인덱스 값에서 해당 ROWID를 추출한다. ROWID를 획득하게 되면 해당 데이터가 실제로 어느 DATAFILE, 어느 블록에 위치하고 있는지 알 수 있다.

③ ②단계에서 획득한 ROWID 정보를 이용해 EMP 테이블을 액세스한다. 이를 통해 데이터만 추출하게 된다.

④ 이와 같이 ROWID는 해당 테이블을 추출하는 중요한 요소가 된다.

이처럼 ROWIS는 SQL에서 인덱스를 이용해 원하는 데이터를 추출할 때 이용된다. 많은 사람들이 해당 SQL이 인덱스를 이용하는지 아닌지에 관심을 가진다.

SQL이 인덱스를 이용했다는 의미는 인덱스를 통해 원하는 데이터의 ROWID를 획득해 해당 ROWID로 테이블을 액세스한다는 것을 의미한다. <리스트 1>의 SQL 실행 결과는 <리스트 2>와 같다.

  • [리스트 2] [리스트 1] 실행 결과
  • ENAME   SAL 
    ALLEN   1600
    

마지막으로 살펴봐야 할 SQL 작성 시의 ROWID 이용에 대해서는 다음 시간에 확인해 본다.

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/2931

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입