by sam [SQL Query] index 분포도 join [2013.01.24 11:28:07]
안녕하세요. 한참 눈팅만 하다가 처음 질문 올려봅니다.. ^^;
A와 B 두 테이블 조인하는데 자꾸 두 테이블 다 풀스캔이 뜹니다..
구조는 아래와 같습니다.
-구조-
A테이블 컬럼
idx number
idx2 varchar2(4)
value varchar2(200)
키,인덱스
PK_A (idx, idx2) - pk, 유니크인덱스
INDEX_A_01 (idx) - 인덱스
-----------------
B테이블 컬럼
idx number
value varchar2(200)
키,인덱스
PK_B ( idx ) - pk, 유니크인덱스
-----------------
-쿼리-
select * from a, b
where a.idx = b.idx
-Plan-
SELECT STATEMENT ALL_ROWS Cost: 57 Bytes: 2,354,472 Cardinality: 11,106
3 HASH JOIN Cost: 57 Bytes: 2,354,472 Cardinality: 11,106
1 TABLE ACCESS FULL TABLE B Cost: 21 Bytes: 178,050 Cardinality: 1,187
2 TABLE ACCESS FULL TABLE A Cost: 35 Bytes: 688,572 Cardinality: 11,106
위 쿼리로 plan과 같이 풀스캔이 됩니다.
개발DB밖에 접속이 안되는데 데이터는 a테이블 1만여건 b테이블 1천여건입니다.
운영DB는 아마도 a테이블 200만건이상, b테이블 4천건 정도로 예상됩니다. (운영DB를 볼 수가 없음..)
제가 생각은 데이터가 적어서 인덱스 컬럼의 분포도 때문에 풀스캔하는 것 같은데요.
이상한 점은 조인할 때 b테이블 드라이빙 할 때 적어도 b테이블의 idx는 index fast full scan 이 떠야 되는거 아닌가요??
질문을 정리해보겠습니다.
1. 위 상태에서 a,b 둘다 풀스캔 하는 이유
2. 분포도 문제라면 운영DB의 데이터가 위 설명대로 일 때 풀스캔하는거 무시하고 위와 같이 조인하면 인덱스를 잘 탈지
3. 분포도 문제일 경우 이런경우에는 어떻게 처리하는게 올바른지..
DBA가 풀스캔에 엄청나게 민감하기 때문에.. 걱정 되서 올립니다.. 잘좀 부탁드릴게요..^^
1번만 답변해주셔도 됩니다... 잘부탁드려요 꾸벅
1. 위 상태에서 a,b 둘다 풀스캔 하는 이유
-> 특정조건이없이 두개를 조인형태이므로? count라든지 한다면 index full scan 타겠네요 10g이상이라면...
2. 분포도 문제라면 운영DB의 데이터가 위 설명대로 일 때 풀스캔하는거 무시하고 위와 같이 조인하면 인덱스를 잘 탈지
-> 제대로된 인덱스, sql을 짜는 수준 에 따라서 타겠죠?
3. 분포도 문제일 경우 이런경우에는 어떻게 처리하는게 올바른지..
DBA가 풀스캔에 엄청나게 민감하기 때문에.. 걱정 되서 올립니다.. 잘좀 부탁드릴게요..^^
-> 왜 풀스캔에 대해서 민감하냐고 물어보세요. 풀을 타야좋을경우도분명있을텐데...
select * from a, b
where a.idx = b.idx
and a.idx > ' '
예전에 통계정보가 없을때 이렇게 꼼수로 해서 사용하긴했었는데..10g이상은
잘모르겠네요..-_-;;