단일 인덱스?? 결합 인덱스?? 0 3 7,311

by 허접탱이 [Oracle 기초] index [2013.02.04 13:38:43]



안녕하세요.
항상 오라클 클럽을 통해 많은 지식을 얻고 배워가는 허접탱이 입니다. ^^

다름 아니라 인덱스 관련하여 궁금한게 생겨서요...
저는 여태까지 인덱스를 생성을 하면 기본적으로 조회조건에 들어가는 컬럼을 단일 인덱스로 생성을 하곤 했었습니다.
그러다 얼마전 지인분께서 그렇게 하면 인덱스가 정상적으로 타지 않는다고 하네요.
여러개의 조건이 들어갈때에는 결합인덱스를 생성하여야 한다고 하는데..
그게 정말 맞는말 인가요?
제가 처음 이쪽에 발을 들였을때에는 그렇게 안배워서...ㅠㅠ

만약 예를 든다면...
A란 테이블이 있고 그 안에는 날짜, 이름, 주민등록번호, 전화번호, 주소 이렇게 5개의 컬럼이 있고,
인덱스는 날짜, 주민등록번호, 이름 이렇게 세개의 컬럼에 각 각 생성을 했습니다.
검색조건에는 날짜는 무조건 들어가며, 주민등록번호/이름 을 추가하여 조회를 할 수가 있습니다.
이렇게 할 경우에 단일 인덱스로 조회를 하게되면 인덱스를 안타게 되는건가요?

만약 결합 인덱스로 생성을 해야한다면 아래와 같이 생성하면 되는건가요?
CREATE INDEX 인덱스1 ON 테이블(날짜,주민등록번호);
CREATE INDEX 인덱스2 ON 테이블(날짜,이름);

DB에 대한 기초 지식이 없다보니... 많이 혼란스럽네요..ㅠㅠ
많은 조언 부탁 드립니다.

그럼 즐거운 오후 되세요.^^
by 사랑초 [2013.02.04 14:17:17]
인덱스에 대해서 섯불리 접근하시게 되면 매우 큰 낭패를 겪으실 수 있습니다;;
테이블 구조나 실행계획을 보지 못한 상태에서 정확한 답변은 드리기 어렵지만,
말씀하신대로라면 인덱스를 타지 않을 것 같습니다...
데이터 전체 건수가 얼마나 되고 선택도/조인관계/변경주기, SELECT 가 자주 이루어지는지
UPDATE 가 자주이루어지는지 등 여러 사항이 고려되어야 하는 부분으로...
인덱스 생성에 대한 예는 아래와 같이 작성할 수 있긴 합니다...
CREATE INDEX INDEX_NAME ON TABLE_NAME
(FIELD1, FIELD2, FIELD3)
LOGGING
TABLESPACE TABLESPACE_NAME
STORAGE    (
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

음... 고수님들이 답변 달아주실때까지 힌트용으로 참고만 하세요^^;

by 부쉬맨 [2013.02.04 15:38:27]
위질문으로 보았을경우
CREATE INDEX 인덱스1 ON 테이블(날짜,주민등록번호,이름);
만드시는게 젤좋아보이네요.

by feelie [2013.02.05 08:54:57]

단일 인덱스보다는 결합인덱스를 사용하는것이 맞습니다.
물론 필요에 따라서 단일 인덱스를 만들수도 있지만 인덱스 전략 자체가 적은 인덱스로 고효율을 낼수 있도록 전략을 세우는것을 목표로 해야 하는것으로 알고 있습니다.

인덱스를
날짜 + 주민번호, 날짜 + 이름으로 만들지, 날짜 + 주민번호 + 이름 으로 만들지는 선택의 문제입니다.
날짜별로 레코드건수가 많다면 날짜 + 주민번호 + 이름 인덱스도 성능이 좋지 않을수 있습니다.
(날짜검색은 대개 범위 검색을 하기 때문이지요)

날짜 + 주민번호 또는 주민번호 + 날짜  로 할지도 문제지만, 실제로 성능상에는 둘다 문제가 없을수도 있습니다.

질문에 답이 없는 내용이자만 인덱스 전략을 한번정도 보심이 맞을것 같습니다.
1. 항상조건절에 사용되는지?
2. 항상 '=' 조건인지?
3.  정렬이 필요한지 ?
4. 분포도는 어떤지
위의 내용은 대용량 데이터 베이스에 나오는 내용인데,
100프로 정답은 아니겠지만 한번정도 기본을 보시고 판단하시는것이 맞을것 같습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입