Oracle 조회 문 에서 rownum 과 rowid 의 차이 점 분석

본 고 는 주로 사례 형식 으로 Oracle 조회 에서 rownum 과 rowid 의 차이 점,그리고 가설 방식 으로 예 를 들 어 조회 조건 은 rownum=2 로 첫 번 째 기록 을 조회 할 때 구체 적 인 내용 에 대한 소 개 를 소개 했다.
검색 에서 우 리 는 유사 하 다 는 것 을 알 수 있다.

select xx from table where rownum < n (n>1) 
이러한 조 회 는 정확 한 의 미 를 가지 고 있다.

select xx from table where rownum = n
이러한 조 회 는 n=1 시 에 만 성립 됩 니 다.

select xx from table where rownum > n (n>1) 
이런 조 회 는 빈 집합 만 얻 을 수 있다.
달리

select xx from table where rownum > 0
이 조 회 는 모든 기록 을 되 돌려 줄 것 이다.왜 그 럴 까요?그 이 유 는 Oracle 이 rownum 에 대한 처리 에 있어 서 rownum 은 결과 집합 을 얻 었 을 때 발생 한 것 으로 결과 집중 순 서 를 표시 하 는 필드 입 니 다.이 필드 는'위조 수열'이 라 고 불 리 며 사실상 존재 하지 않 는 수열 입 니 다.그것 의 특징 은 순서대로 표시 되 고 차례로 추 가 된 것 이다.다시 말 하면 rownum=1 의 기록 이 있어 야만 rownum=2 의 기록 이 있 을 수 있다 는 것 이다.
where 에서 rownum 을 Oracle 조회 조건 으로 사용 하 는 상황 을 되 돌아 보 자.rownum=1,또는 rownum<=n(n>1)을 가 져 올 때 문제 가 없습니다.그렇다면 왜 조건 이 rownum=n 또는 rownum>=n 일 때 데이터 가 있 는데 빈 집합 만 얻 을 수 있 습 니까?우리 의 조회 조건 이 rownum=2 라 고 가정 하면 첫 번 째 기록 을 조회 할 때 Oracle 은 이 기록 rownum 을 1 로 표시 한 결과 rownum=2 의 조건 과 일치 하지 않 아 결과 집합 이 비어 있 습 니 다.
하면,만약,만약...

select xx,yy from table where zz > 20 and rownum < 10
그러면 실행 할 때,먼저 zz>20 의 조건 에 따라 결과 집합 을 조회 한 다음,rownum 에서 10 개 를 꺼 내 서 되 돌려 줍 니까?아니면 zz>20 의 조건 에 따라 먼저 조회 한 다음 에 기록 이 있 으 면 rownum 을 표시 하고 rownum<10 시 까지 조 회 를 중단 합 니까?개인 적 으로 후자 라 고 생각 합 니 다.즉,문 구 를 실행 할 때 full scan 을 하 는 것 이 아니 라 데 이 터 를 충분히 취하 면 조 회 를 중단 하 는 것 입 니 다.
이 아 이 디 어 를 검증 하 는 것 은 간단 할 것 이다.데이터 양 이 매우 많은 표를 찾 아 Oracle 조 회 를 하면 된다.안 타 깝 게 도 현재 나 는 이런 시계 가 없어 서 조건 이 있 는 독자 가 스스로 테스트 할 수 있다.
rownum 을 직접 사용 하 는 것 은 제한 을 받 아야 한 다 는 것 을 알 수 있다.그러나 이러한 요 구 를 만 나 기 쉽다.예 를 들 어 페이지 의 페이지 처리 등 조건 에 맞 는 xx 조 에서 xx 조 까지 의 기록 을 찾 아 낸다.이 럴 때 어떻게 자신 에 게 맞 는 결과 집 을 만 듭 니까?
물론 모두 꺼 내 서 손 으로 고 르 는 것 도 가능 하지만 전 제 는 전체 데이터 세트 의 데이터 항목 수가 많 지 않 은 상황 이다.만약 10 만 수백 개의 데 이 터 를 만 나 모두 꺼 내 면 사용 자 는 다른 일 을 할 필요 가 없다.이 럴 때 사용 자 는 어떻게 해 야 합 니까?당연히 우리 가 소개 한 rownum 라 를 써 야 지!rownum 은"위조 수열"이 아 닙 니까?글 쎄 요.우 리 는 지금 그것 을 실제 필드 로 만 들 면 됩 니 다.
구체 적 인 방법 은 하위 Oracle 조 회 를 이용 하여 임시 표를 구축 할 때 rownum 도 함께 구성 하 는 것 이다.예 를 들 면

select xx,yy from (select xx,yy,rownum as xyz from table where zz >20) where xyz between 10 and 20
이렇게 하면 돼.
또한 Oracle 이 제공 하 는 결과 집합 처리 함수 minus 를 사용 해도 할 수 있 습 니 다.예 를 들 어

select xx,yy from table where zz > 20 and rownum <20 minus select xx,yy from table where zz>20 and rownum <10
하지만 마 이 너 스 를 사용 하 는 것 이 하위 검색 을 사용 하 는 것 보다 자원 을 더 소모 하 는 것 같 습 니 다.
rownum 과 비슷 하 게 Oracle 은 또 다른 위조 수열 인 rowid 를 제공 했다.그러나 rowid 와 rownum 은 다 릅 니 다.일반적으로 모든 줄 의 데이터 에 대응 하 는 rowid 는 고정 적 이 고 유일한 것 입 니 다.이 줄 의 데이터 가 데이터 베 이 스 를 저장 할 때 확 정 됩 니 다.rowid 를 이용 하여 기록 을 조회 할 수 있 으 며,rowidOracle 을 통 해 기록 을 조회 하 는 것 은 조회 속도 가 가장 빠 른 조회 방법 이다.
이것 에 대해 저 는 해 본 적 이 없습니다.그리고 길이 가 18 자리 이 고 규칙 이 뚜렷 하지 않 은 문자열 을 기억 하 는 것 은 매우 어 려 운 일이 기 때문에 저 는 개인 적 으로 rowid 를 이용 하여 기록 을 조회 하 는 실용성 이 그리 크 지 않다 고 생각 합 니 다.또한 rowid 는 표 에서 이동(예 를 들 어 표 공간 변화,데이터 가 져 오기/내 보 내기 이후)이 발생 해 야 변화 가 발생 합 니 다.

좋은 웹페이지 즐겨찾기