join select 할때 * 로 하면 index를 타는데 컬럼을 지정하면 access full 이 되는 이유가 궁금 합니다. 0 5 1,202

by 허진영 [2017.03.08 10:05:19]


join select 할때 * 로 하면 index를 타는데 컬럼을 지정하면 access full 이 되는 이유가 궁금 합니다.

 

컬럼을 지정 한 것과 *로 한 것이 index에 영향을 주는 건가요?

by jkson [2017.03.08 10:27:53]

select 절에 * 한 것과 컬럼 지정한 것의 차이 이야기하시는 것 맞죠?

*를 지정했을 때 full이고 컬럼을 지정하면 인덱스 타는 건 가능성이 조금 있는데 그 반대는 이상한데요?

예를 들어

col1 ~ col30 으로 구성된 tableA에서

col1, col2, col3으로 구성된 인덱스가 있을 때

select col1, col2
from tableA
where col3 between '1900-01-01' and '2999-12-31'--테이블의 모든 범위

이렇게 쿼리를 만들면 인덱스 정보만 이용해도 모든 정보를 가지고 올 수 있지만

select *
from tableA
where col3 between '1900-01-01' and '2999-12-31'

이렇게 쿼리를 만들면 인덱스 정보를 읽고 테이블로 가봐야지 col4에서 col30까지의

정보를 가지고 올 수 있습니다.

인덱스 한 건 읽고 -> 테이블 데이터 블록 하나 읽고
인덱스 한 건 일고 -> 테이블 데이터 블록 하나 읽고

이것이 과정이 반복이 된다면 아주 비효율적이죠.

오히려 인덱스를 읽지 않고 테이블 정보만 읽는 게 더 낫겠죠?

해서 *를 쓰면 full scan할 가능성이 있고 컬럼을 지정하면 인덱스만 활용할 가능성이 있습니다.

이것을 말씀하시는 게 맞는지 모르겠네요.

 

 


by 허진영 [2017.03.08 10:34:21]

답변 감사합니다.

저의 경우는 쿼리가 아래와 같을때 

select *

  from t1

inner join t2

on (t1.index1 = t2.col1)

일경우 t1의 index range scan 이 되는데

select t1.index1, t1.col1

  from t1

inner join t2

on (t1.index1 = t2.col1)

하면 table access full 이 됩니다. 

 

왜그런지 모르겠어요 ㅠㅠ


by jkson [2017.03.08 10:45:33]

이상하네요;

t2.col1은 인덱스 컬럼이 아닌가요?

조인 순서에 변화는 없는지요?

t2->t1에서

t1->t2로 바뀐 것은 아닌지..

지식이 짧아서 어떤 상황인지 감이 잘 안 오네요.


by 마농 [2017.03.08 21:45:03]

* 일때는 두테이블 컬럼을 모두 읽지만.
컬럼 지정했을때는 t1의 항목만 조회하네요.
이 경우 t2 의 조인컬럼 인덱스 종류에 따라 아예 t2 를 읽지 않고 t1 만 읽을 가능성도 있습니다.(외래키)
또는 NL 조인으로 풀리던게 HASH 조인으로 바뀌었을 수도 있구요.
단순히 일부 스캔 방식만 보지 말고. 전체 실행계획을 확인해야 합니다.


by 허진영 [2017.03.09 17:40:59]

정말 감사합니다.

 

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