order by 정렬 랜덤 엑세스 엑세스에 대해서 물어볼게 있습니다. 0 6 1,499

by 루비루비루 [Oracle 기초] 정렬 랜덤 엑세스 order by [2017.09.04 17:37:58]


안녕하세여 오라클 에 대해서 여쭤 볼게 있습니다.

오라클 책을 보다가 나온 구절인데 ..

랜덤 엑세스 에는 여러 종류가 있는데 

order by 정렬시에 랜덤 엑세스가 발생이 되어서

인덱스를 걸어야 랜덤 엑세스를 방지 할수 있다고 나와 있습니다.

이것을 정렬 랜덤  엑세스라고 하는데

이해가 안가는 부분이 왜 인덱스를 걸어야 랜덤 엑세스를 방지 할수 있나요?

정렬 할때 데이터를 필요한 데이터를  다 불러와서 다시 재정렬 하는 방식으로 알고 있는데

아닌가요? 인덱스를 걸면 왜 랜덤 엑세스가 방지 되는지 . 내부 원리좀 알려주세요. 감사합니다

 

 

by 마농 [2017.09.04 18:08:24]

인덱스 스캔후에 인덱스에 없는 항목이 필요할 때
rowid 를 이용하여 테이블을 읽는 랜덤엑세스가 발생됩니다.
이때 필요 항목의 위치에 따라 랜덤엑세스를 구별해 놓은게 있네요.

1. 추출 랜덤엑세스 : Select
2. 확인 랜덤엑세스 : Where
3. 정렬 랜덤엑세스 : Order by

이런 구별법은 글쎄요? 혼란만 가중시키는 구별법인 것 같은데요....
그냥 필요 항목이 order by 절에 기술되어 있을 뿐인데요.
마치 랜던엑세스가 정렬 때문에 발생하는 듯한 느낌이 있네요.

위치에 따라 구별할 필요가 없을 것 같습니다.
그냥 필요 항목이 인덱스에 있는지? 없는지로 판단하면 될 것 같네요.
인덱스 스캔 시에 필요 항목이 인덱스에 모두 있다면? 인덱스만 읽고 끝날 것이고
인덱스 스캔 시에 필요 항목이 인덱스에 없다면? 인덱스 읽고 테이블 랜덤엑세스 발생하겠죠.


by 콩나무 [2017.09.04 18:15:52]

아마 이런 의미 일 것 같네요. select a from table where a=3 order by a,b 이런 쿼리가 있다고 가정 하에 index가 a 컬럼에 있으면, order by 절에 b 컬럼이 인덱스에 없기 때문에

index를 타고 b를 확인 하기 위해 테이블 엑세스를 한번 이런식 으로 랜덤엑세스가 일어나니, a,b 두 컬럼에 인덱스를 생성 해서 방지 되는 것 같네요


by 루비루비루 [2017.09.06 15:07:52]

답변 주셔서 감사합니다

그래도 좀 이해가 가지 않는것이

a 인덱스만 타고 해당 블럭에 b 데이터도 같이 가져오기 때문에 

데이터가 없는데도 블럭에 접근하는 비효율은 일어 나지 않을 것같은데요

그리고 b 데이터의 값도 전부 필요한 값일것 같은데 

예를 혹시 잘못 드심이 아니실런지 ㅎ 

제가 모르는 오더바이의 랜덤 엑세스가 있나요? ㅎㅎ 고수님들 알려주세요


by jkson [2017.09.06 16:26:16]

인덱스를 읽고 인덱스만으로 모든 정보를 확인할 수 없어 인덱스의 rowid로 테이블 정보에 접근하는 것을

랜덤엑세스라고 정의합시다.

select 절, where 절, order by 절 컬럼 모두가 index 컬럼이라면 인덱스에만 접근하여 데이터를 가져오고

테이블에 접근하지 않습니다.

그런데 select 절에 index에는 없는 컬럼이 있으면 인덱스 정보만 보아서는 해당 컬럼 값을 알 수 없기 때문에

테이블 정보로 가야합니다. 이때 발생하는 것이 추출랜덤엑세스구요.

마찬가지로 where 절에 인덱스에 없는 컬럼이 있어서 발생하는 것이 확인랜덤엑세스,

order by 시 발생하는 것이 정렬랜덤엑세스라고.. 어떤 책에서 적혀있더군요.

콩나무님 예시를 보면

select a

from t

where a = 1

order by a, b

이런 쿼리가 있을 때 a, b 컬럼으로 구성된 결합인덱스가 있었다면 랜덤엑세스는 발생하지 않았겠죠.

헌데 a컬럼으로만 구성된 단일 인덱스가 있었다면 b 컬럼 정보를 알기위해 테이블로 접근해야합니다.

이때 단일 컬럼 인덱스에다가 b를 추가해주면 테이블로 접근하지 않아도 되겠죠.

정렬을 위해 랜덤액세스를 하지 않아도 되니 인덱스를 추가한 것으로 정렬랜덤액세스를 줄여줄 수 있는 것이죠.


by 루비루비루 [2017.09.07 14:33:00]

jkson님 감사합니다 꾸벅

아아 --;; 랜덤 엑세스의 범주 차이가 있었군요.

이제 이해가 가네요 ㅎ 감사합니다..


by jkson [2017.09.07 15:03:58]

굳이 나누자면 저렇게 나눈다는 것인데 랜덤액세스의 범주로 따로 구분할 필요는 없을 것 같아요.

(원리는 어차피 똑같으니까요.. 컬럼 정보가 필요한데 인덱스에 없어서 테이블 블럭을 확인했다는 거잖아요ㅎㅎ)

index에 없는 컬럼이 select, where, order by 에 모두 나오면 그건 어떤 분류일까요?

추출인지, 확인인지, 정렬인지 구분이 애매해지죠.

그냥 랜덤액세스가 필요한 컬럼이 인덱스에 없어서 테이블로 갈 때 일어난다 정도만

아시면 될 것 같습니다. 시험치실 거면 그냥 저런 게 있더라 정도만 아시면 될 것 같구요.

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