본문 바로가기

프로그래밍/oracle

oracle - rowid와 rownum의 용도 및 예제

반응형

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; 

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

 

 


반응형