0과1뿐인 필드가 인덱스를 안타네요 ㅠ.ㅠ 1 8 1,766

by 김태성 [Oracle 기초] [2015.10.19 11:31:08]


데이터가 1700만건정도 들어있는 테이블이 있구요.

PRODUCT_NO, PRODUCT_CODE, ,NAME, STORAGE_FLG

대강 요런 4개의 필드가 있습니다.

이 테이블에는 PRODUCT_NO에 프라이머리키를 달아서 단일 인덱스가 하나 생성되어있구요.

STORAGE_FLG는 NUMBER형으로 0과 1만 들어가고 0이면 창고 1이면 진열중 이라는 의미입니다.

이 테이블에서 검색 조건으로 자주 사용될것으로 예상한게

PRODUCT_CODE와 STORAGE_FLG인데요.

PRODUCT_CODE나 PRODUCT_NO는 인덱스를 붙이면 인덱스를 잘 탑니다.

근데 STORAGE_FLG는 인덱스를 타지 않네요...

확인하기 쉽게위해서 현제 PRODUCT_NO의 인덱스는 지운상태고 STORAGE_FLG 단일 인덱스를 만들어 놓은 상태입니다.

STORAGE_FLG는 1700만건의 데이터중에 10건정도만 1이고 나머지는 0인상태입니다.

SELECT COUNT(*) FROM ALL_PRODUCT WHERE STORAGE_FLG = 1

이렇게 검색해도 인덱스를 타지않는 이유를 잘 모르습니다 ^^;

데이터가 0과 1뿐이라 인덱스를 타지 않는 편이 더 효율이 좋다고 오라클이 판단하고 있는걸까요?

 

by jkson [2015.10.19 12:16:17]

전제 데이터 중 검색하려고 하는 데이터가 50%(0, 1 처럼 반반으로 구성) 정도일 경우에는 full scan 할 거예요. 분포도는 15%가 넘지 않을 때 인덱스 만들어 주는 게 좋습니다.


by 김태성 [2015.10.19 12:51:45]

감사합니다 ^^ 


by 겸댕2후니 [2015.10.19 14:41:21]

이 질문에서는 1700만건의 데이터중에

STORAGE_FLG값이 1인건 10개 뿐이라고 말씀하셨는데,

RBO라면 분포도에 관련없이 당연히 인덱스를 타겠고,

CBO의 경우, 분포도가 10/1700000 인데

인덱스를 타는게 정상아닌가요?


by jkson [2015.10.19 15:14:37]

제가 제목만 읽고 내용을 제대로 안 읽었네요. 0과 1의 분포가 비슷하다면 인덱스를 안 타겠지만 1700만 건중 10건만 1이라면 storage_flg = 1일 때 인덱스를 타는 게 맞네요. 뭔가 다른 이유가 있을 것 같네요. INDEX를 다시 ANALYZE 한번 해보세요.


by 김태성 [2015.10.20 15:19:14]

어 음 그러니까 인덱스를 타야하는게 맞는거군요 ㅋㅋ; 좀더 확인해보고 해결되면 답글달고 잘 안되면 다시 질문드리겠습니다 감사합니다


by 김태성 [2015.10.20 16:02:06]

STORAGE_FLG인덱스의 정렬순서를 ASC로 하면 인덱스를 안타고 DESC로 하면 타네요...이런경우는 또 처음이네요 ㅎㅎ 아무튼 해결됐습니다 ;; 근데 인덱스를 타도 코스트가 13000에서 12000으로 1000정도 줄어서 생각만큼 확 좋아지진 않네요 ㅎ


by 마농 [2015.10.20 16:52:15]

DESC 인덱스는 좋은 해결책이 아닌 듯 하네요.

컬럼에 대한 통계정보인 히스토그램에 대해 검색해 보세요.


by 김태성 [2015.10.21 09:56:53]

마농님 히스토그램 검색해서 애널라이즈로 STORAGE_FLG 컬럼에 SIZE 2해서 분석해줬더니 인덱스가 움직이게 돼었습니다. 코스트가 13000에서 6으로 줄었네요. 싸랑합니다

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