동일일자로 order by 했을 때, 정렬순서가 어떻게 되나요? 0 6 3,257

by 광수 [SQL Query] oder by 동일 일자 정렬순서 [2017.03.30 17:25:15]


안녕하세요.

"ORDER BY 동일일자" 로 조회할 경우 정렬순서가 궁금합니다.

예를 들어, 10개의 레코드 (각 레코드의 일자 컬럼의 값은 동일함) 입력 후

※ 동일일자 : 2017-03-30 14:10:11

SELECT *
    FROM TABLE_A
ORDER BY TABLE_A.일자

할 경우 아래와 같이 조회되네요.

예상 실제
1 1
2 2
3 3
4 4
5 10
6 6
7 7
8 8
9 9
10 5

 

5개의 레코드를 입력할 경우

예상 실제
1 1
2 2
3 5
4 4
5 3

 

물론, ROWID는 1부터 10까지 순차적으로 증가하고 있구요

왜 이런 현상이 발생할까요???

by 광수 [2017.03.30 17:31:05]

일자가 아닌 다른 동일한 값을 가진 컬럼으로 정렬하면 

순차적(1부터 10까지) 으로 정렬되는데, 왜 동일일자 컬럼으로 정렬하면 위와 같은 현상이 발생할까요?? ㅠㅠ


by jkson [2017.03.30 17:35:25]

표시해주신 숫자가 뭘 뜻하는 건가요? 데이터를 입력한 순서인가요?

인덱스 스캔의 경우 한번에 한 블럭씩 데이터를 가지고 오고 동일한 데이터에 대해서는 rowid 순으로 가지고 오구요.

풀 스캔일 경우에는 한번에 여러 블럭씩 multi read하기 때문에 rowid 순으로 나오지 않습니다.


by 광수 [2017.03.30 17:36:44]

네네 맞습니다. ^^


by jkson [2017.03.30 17:39:37]

뒤에 입력한 데이터가 rowid가 항상 크다는 보장은 없죠. 입력된 순서대로 나오게 하려면

테이블에 regtime 컬럼을 넣으시고 order by 일자, regtime 으로 해주셔야 합니다.

약간 더 살을 붙여 설명드리면..

일자로 소팅된 인덱스를 사용하여 sort하였다면 rowid순,

그게 아니라 풀스캔했다면 데이터 를가지고 올 때도 rowid순이 아니었을 것이고

더군다나 sort 까지하였으므로 더더욱 rowid순이 아니게 됩니다.

또한 데이터를 입력한 순서대로 rowid를 증가시키면서 저장하지도 않습니다. 어디 저장하는지는

그 당시 서버 상황에 따라 달라지겠죠.


by 마농 [2017.03.30 17:47:24]

원인을 아는 것보다는 이러한 현상을 알았다는게 더 중요합니다.
원인은 중요하지 않습니다. 이렇게 사용하지 않으면 됩니다.
특히나 패이징 쿼리에서 이렇게 사용하면?
페이지 넘어갈때 나왔던게 또 나오거나, 안나왔던게 영원히 안나오는 오류가 생깁니다.
페이징 처리의 정렬항목엔 반드시 유니크 항목이 추가되어야 합니다.


정렬결과는.
오라클 내부 정렬 알고리즘에 따라 달라지겠네요.
정렬 알고리즘만 해도 여러가지가 있죠.
버전에 따라 다른 알고리즘을 적용했을 수도 있습니다.
내부 알고리즘까지 파악하기 보다는 이렇게 사용하지 않는것이 중요합니다.


by 광수 [2017.03.30 18:14:33]

두 분 모두 너무 감사합니다. 많은 도움됐어요.

 

감사~~

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