Index 관련 해서 질문 있습니다 0 7 2,156

by 스파이 [Oracle Tuning] index [2015.11.23 15:30:44]


안녕하세요~

어떤 데이터를 조회 하는데 같은 키 값임에도 조회하는데 시간이 많이 차이가 나서 질문 드립니다.

CREATE INDEX VMS1.IDX_RESMST_09 ON VMS1.RESMST
(RESNAME, RESNO)
LOGGING
TABLESPACE TSVMS01_IDX
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          10M
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );
IDX_RESMST_09 이 인덱스의 경우 조회하는데 5초 가량 걸립니다.

 

CREATE INDEX VMS1.IDX_USRID ON VMS1.RESMST
(ID)
LOGGING
TABLESPACE TSVMS01_IDX
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          184M
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

 

IDX_USRID 해당 인덱스의 경우 조회시 0.030초가 걸립니다.

 

INITIAL 부분 밖에 차이가 안나는데 인터넷에서 찾아봤으나 이해가 잘 안되서 질문 드립니다.

 

by 이재현 [2015.11.23 17:17:46]

인덱스 구성 컬럼에서도 차이가 나는데요?


by 스파이 [2015.11.23 17:25:34]

아... 넵~

구성 컬럼이 다릅니다.

데이터 타입형식이 같아서 언급을 따로 안했는데...

혹 구성컬럼이 문제가 될까요?


by 마농 [2015.11.23 17:31:12]

인덱스를 조회한다는 표현부터 어딘가 좀 이상합니다.
인덱스를 조회하는게 아니고 테이블을 조회하는 거구요.
인덱스는 테이블 조회시 성능 향상을 위해 이용하는 것입니다.


만들어 놓은 각 인덱스의 쓰임새가 전혀 다른데요?
전혀 다른 검색조건에서 각각 사용될 것입니다.
전혀 비교할 수 없는 것을 어찌 비교하신 것인지?


by 스파이 [2015.11.23 17:39:01]

아... 데이터를 조회 하는데 있어 연번으로 조회를 하는 방법이 있고, ID 값으로 조회를 하는 방법이 있는데 연번과 ID가 키 값임에도 불구하고 출력되는 속도가 틀려 로그를 찍어보니 아래와 같은 쿼리가 찍혀서 출력되는 시간을 비교 해봤습니다

 

SELECT 
  resno, resname, respsno, FNGETRESCENTNAME(resno), statusdiv, registedate, 
  grpname, email, postno, addr1, addr2, telno, mobno, id
FROM 
  (SELECT 
     ROWNUM AS RNUM, email, postno, addr1, addr2, telno, mobno, centcode, resno, 
     resname, respsno, statusdiv, registedate, grpname, id
   FROM 
     (SELECT /*+ INDEX(resmst IDX_RESMST_09) */ 
        email, postno, addr1, addr2, telno, mobno, centcode, resno, resname, 
        respsno, '' statusdiv, registedate, '' grpname, id
      FROM resmst
      WHERE
        1=1 AND
        substr(respsno,0,1) <> 'i' AND
        resno = 15598348 
      ORDER BY resname ASC)
   WHERE
     ROWNUM <= 10 )
WHERE
  RNUM BETWEEN 1 AND 10;

이 부분은 연번으로 조회를 한거구요

 

SELECT 
  resno, resname, respsno, FNGETRESCENTNAME(resno), statusdiv, registedate, 
  grpname, email, postno, addr1, addr2, telno, mobno, id
FROM 
  (SELECT 
     ROWNUM AS RNUM, email, postno, addr1, addr2, telno, mobno, centcode, resno, 
     resname, respsno, statusdiv, registedate, grpname, id
   FROM 
     (SELECT /*+ INDEX(resmst IDX_USRID) */ 
        email, postno, addr1, addr2, telno, mobno, centcode, resno, resname, 
        respsno, '' statusdiv, registedate, '' grpname, id
      FROM resmst
      WHERE
        1=1 AND
        substr(respsno,0,1) <> 'i' AND
        id = 'abcd' 
      ORDER BY resname ASC)
   WHERE
     ROWNUM <= '10' )
WHERE
  RNUM BETWEEN 1 AND 10;

이 부분은 ID로 조회 했을때의 쿼리 입니다.


by 마농 [2015.11.23 18:05:13]

인덱스의 선두컬럼에 대한 조건이 없네요?
선두컬럼 조건 없이 후행컬럼 조건만으로 인덱스 못탑니다.
인덱스 컬럼의 순서를 바꾸셔야 합니다.


단, resname 으로 조회하는 쿼리는 없는지 확인하셔야 합니다.
  - resno 으로 조회하는 빈도가 더 많은지?
  - resname 으로 조회하는 빈도가 더 많은지?
에 따라 어떤 컬럼을 앞에 둘것인지 고민해야 합니다.
아예 두가지 조합을 모두 수용할 수도 있구요.
두가지 모두 수용할지 한가지를 포기할지도 고려해야 합니다.


by 스파이 [2015.11.23 18:53:29]
SELECT
  resno, resname, respsno, FNGETRESCENTNAME(resno), statusdiv, registedate,
  grpname, email, postno, addr1, addr2, telno, mobno, id
FROM
  (SELECT
     ROWNUM AS RNUM, email, postno, addr1, addr2, telno, mobno, centcode, resno,
     resname, respsno, statusdiv, registedate, grpname, id
   FROM
     (SELECT
        email, postno, addr1, addr2, telno, mobno, a.centcode, a.resno,
        a.resname, a.respsno, a.statusdiv, b.registedate, '' grpname, b.id id
      FROM
        resmst_search a, resmst b
      WHERE
        1=1 AND
        a.resno = b.resno AND
        substr(a.respsno,0,1) <> 'i' AND
        a.centcode = '03003280' AND
        a.resname LIKE '홍길동'
      ORDER BY a.resname ASC)
   WHERE
     ROWNUM <= 10 )
WHERE
  RNUM BETWEEN 1 AND 10;

 

이름으로 조회를 하니... 인덱스를 안타네요

...

이럴 경우 IDX_RESMST_09 인덱스를 사용 하는 곳을 조회해 보고

만약 선두컬럼(resname)을 조회 하는 부분이 없다. 라고 한다면

인덱스 상에서 resname을 지우는게 맞을까요?


by 마농 [2015.11.24 13:38:35]

" resname LIKE '홍길동' " 조건이 있는데도 인덱스를 안탄 이유가 뭘까요?
 1. 혹시 " resname LIKE '%홍길동%' " 식으로 % 를 이용하신것은 아닌지?
 2. 혹시 centcode 항목에 인덱스가 있어서 그 인덱스를 탄것은 아닌지?


만약 선두컬럼(resname)을 조회 하는 부분이 없다. 라고 한다면?
 인덱스 상에서 resname을 지우는게 맞을까요?
 지워도 되고, 순서를 바꿔도 됩니다.
 필요 없다 생각하시면 지우시고요
 인덱스 검색은 안하더라도 결과조회에 포함된다면 인덱스 뒤쪽에 두셔도 됩니다.

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