2008. 10. 8. 15:26

[oracle]rowid와 rownum의 정의와 사용법

1 . rowid와 rownum의 정의와 사용법을 알고 싶습니다..

rowid : 테이블에 있는 해당 로우를 찾기위해 사용되는 논리적인 정보
ROWID를 분석해보면
AAAArs AAD AAAAUa AAA
------ --- ------ ---
1 2 3 4
1) 6자리 : 데이터 오브젝트 번호
2) 3자리 : 상대적 파일 번호
3) 6자리 : 블록 번호
4) 3자리 : 블록내의 행 번호

어떤곳에서는 "물리적인 정보"라고 적혀있기도 하지만, 곰곰히 생각해보면 물리적인
정보보다는 오라클이 사용하는 "논리적인 정보"라고 보는것이 맞다고 생각됩니다.

rownum : 결과집합에 대한 가상의 순번
따라서 같은 SQL이라고 하더라도, 다른 rownum 을 가질수 있다.


2.각각이 언제,어떻게 사용하는건지 그 둘의 차이점은 뭔지 알려주시면 대단히 감사하겟습니다..

업무에 따라, 혹은 활용면에 있어 여러 각도로 사용할 수 있겠지만, 지금 생각나는 몇가지만
적어본다면,

1) rowid

가.행을 찾아가는 가장 빠른 방법이 rowid 라는 것을 이용.
update emp
set sal = 999
where rowid in (select rowid from emp where ename like 'A%');
==> 따라서 인덱스의 활용과도 연관성이 있을거라 생각됩니다. 인덱스는 인덱스 컬럼과 rowid를
가지고 있으니까요.

나.데이터가 non-unique 한 환경일때, 데이터에 "유일성"을 부여할수있다.
예를 들면, 이전 페이지에 나왔던 데이터가 다음 페이지에 중복되어 나오는것을 방지할수있다.
이순신이라는 사람이 10건 있다고 할때, 이전페이지에 7건이 나왔다고 하면 "다음"버튼을 누르
면 나머지 3명의 이순신이 나와야되는 업무가 있을때 like 를 쓰게되면 10명 모두 나오게 된다.
이때 rowid를 적절히 이용하면 이들에게도 유일성을 보장할 수 있다.
select * from emp
where ename || rowid > :ename || :before_rowid

참고로, 이 원리는 MSSQL2000에서도 그대로 반영되고 있습니다.
MSSQL2000의 인덱스페이지를 살펴보면, unique 일 경우에는 4byte의 "?"컬럼이 생기지않지만,
non-unique 할때는 4byte의 "?" 컬럼이 생겨 값들의 유일성을 보장하고 있는 것을 알수있습니다.
결국 unique라는 옵션 하나만 잘 사용해도 엄청난 수행속도를 보장받을수 있는거죠.

2) rownum

가.개발시 테스트 용도로 사용
100만건의 테이블을 잘못 select 하면 그 결과가 다 나올때까지 기다리는 경우가 있는데.
이때 where rownum < 10; 를 추가하여 실행시키면 기다릴필요가 없겠죠? (물론 ctrl+c 해도 되지
만...)
약간의 응용력만 있다면, 이 기능도 충분히 업무에 활용할수있다고 봅니다. (ex.게시판)

나. copy_t 테이블 생성시...
create table qq_t
as
select rownum no, to_char(rownum, '09') c_no from cdr -- cdr 테이블은 최소한 100건 이상
where rownum<100;

그외에도 개인의 응용력에 따라 유용하게 사용할 수 있을거라 생각됩니다.

from en-core forum
 
출처 : http://blog.empas.com/goldenant/5477949