by 루비루비루 [Oracle 기초] 정렬 랜덤 엑세스 order by [2017.09.04 17:37:58]
안녕하세여 오라클 에 대해서 여쭤 볼게 있습니다.
오라클 책을 보다가 나온 구절인데 ..
랜덤 엑세스 에는 여러 종류가 있는데
order by 정렬시에 랜덤 엑세스가 발생이 되어서
인덱스를 걸어야 랜덤 엑세스를 방지 할수 있다고 나와 있습니다.
이것을 정렬 랜덤 엑세스라고 하는데
이해가 안가는 부분이 왜 인덱스를 걸어야 랜덤 엑세스를 방지 할수 있나요?
정렬 할때 데이터를 필요한 데이터를 다 불러와서 다시 재정렬 하는 방식으로 알고 있는데
아닌가요? 인덱스를 걸면 왜 랜덤 엑세스가 방지 되는지 . 내부 원리좀 알려주세요. 감사합니다
인덱스 스캔후에 인덱스에 없는 항목이 필요할 때
rowid 를 이용하여 테이블을 읽는 랜덤엑세스가 발생됩니다.
이때 필요 항목의 위치에 따라 랜덤엑세스를 구별해 놓은게 있네요.
1. 추출 랜덤엑세스 : Select
2. 확인 랜덤엑세스 : Where
3. 정렬 랜덤엑세스 : Order by
이런 구별법은 글쎄요? 혼란만 가중시키는 구별법인 것 같은데요....
그냥 필요 항목이 order by 절에 기술되어 있을 뿐인데요.
마치 랜던엑세스가 정렬 때문에 발생하는 듯한 느낌이 있네요.
위치에 따라 구별할 필요가 없을 것 같습니다.
그냥 필요 항목이 인덱스에 있는지? 없는지로 판단하면 될 것 같네요.
인덱스 스캔 시에 필요 항목이 인덱스에 모두 있다면? 인덱스만 읽고 끝날 것이고
인덱스 스캔 시에 필요 항목이 인덱스에 없다면? 인덱스 읽고 테이블 랜덤엑세스 발생하겠죠.
인덱스를 읽고 인덱스만으로 모든 정보를 확인할 수 없어 인덱스의 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를 추가해주면 테이블로 접근하지 않아도 되겠죠.
정렬을 위해 랜덤액세스를 하지 않아도 되니 인덱스를 추가한 것으로 정렬랜덤액세스를 줄여줄 수 있는 것이죠.