블로그 이미지
SITD

카테고리

분류 전체보기 (34)
1.DB (4)
2.OS (3)
3.PROGRAMMING (14)
4.학업 (0)
5.영어 (0)
6.KSIT (5)
7.증권 (1)
8.EXCEL (0)
9.Graduate (2)
기타 (5)
Total
Today
Yesterday

달력

« » 2024.3
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

공지사항

태그목록

최근에 올라온 글

오라클 ROWNUM

1.DB/ORACLE / 2011. 4. 22. 10:18
우선 로우넘은 슈도컬럼이다.
보이지 않지만 편의를 위해 존재하는 컬럼. 이런게 몇개 있어요 rowid, rownum, ora_rowscn같은 것들..


rownum을 할당하는데는 순서가 있는데,

현재까지 이해하고 있는 걸론 연산 후 결과출력값 순서대로 값을 준다.
맨처음 리턴된 값에 1
그 다음 번 값에 2
이런 순서로 로우에 넘버를 주기 때문에 rownum = 2같은 경우엔 조건이 성립이 될수가 없다. 대상으로부터 첫 로우를 받기 전엔 rownum은 무조건 1인 상태니까.

로우넘을 설정하는 순서는
1. 소팅 연산이 없을 경우 = 디비에서 가져온 값 순서대로 rownum

2. 소팅 연산이 있을 경우 = 소팅의 결과로 가져온 값 순서대로 rownum
1) 디비에서 값을 가져온다 = 이때 디비에서 읽은 순서대로 rownum 설정
2) 디비에서 가져온 값을 정렬한다. = 정렬결과 리턴된 값 순서대로 다시 rownum설정. 이때 상단의 rownum은 사라지는건지 덮어씌어지는건진 모르겠지만 이미 사라진 이후. 



3. 특이 케이스라고 할 수 있는게 인덱스.
인덱스의 특징은 바로 정렬.
데이터를 정렬해야 하는데 해당 데이터의 정렬키가 인덱스와 동일하다면?
디비에서 가져올 때부터 인덱스 순서대로 정렬된 순서로 가져오면 되지 굳이 디비에서 값을 가져온 후 정렬 시키는 오버헤드를 할 필요가 없다 
그렇기 때문에 디비에서 가져오는 순서 = 정렬된 순서
가 되어 로우넘이 인덱스 순서대로 부과가 된다. 
물론, 오더바이 순서를 바뀌는 순간 로우넘은 뒤죽박죽. 


즉 1단계(order by)전과 후의 rownum이 다르다.
왜 이런가, 바로 ORDER BY의 수행 순서 때문이다.order by는 모든 대상을 찾은 다음에 수행되고 DB에서 읽어온 데이터의 rownum은 where 절을 기반으로 가져온 데이터 순서대로 이미 주어져 있기 때문이다.
그래서 인라인 뷰로 묶은 다음에 외부에서 로우넘을 읽어와야 정렬된 rownum을 얻을 수가 있다.

'1.DB > ORACLE' 카테고리의 다른 글

아우터 조인의 원리는?  (0) 2011.05.17
Posted by SITD
, |

최근에 달린 댓글

글 보관함