카테고리 없음

Oracle(2022.03.02)-INDEX

AIN99 2022. 3. 2. 15:48
728x90

INDEX
 -자료검색효율을 높이기 위한 객체
 -DBMS의 검색작업의 부하를 줄여 시스템 전체성능 향상
 -SELECT 문, INSERT 문, UPDATE 문에서 사용하는 WHERE 절에 사용
 -ORDER BY, GROUP BY 절에 사용하여 처리속도 향상 
 -별도의 기억공간과 인덱스 파일의(구성) 유지에 시간이 많이 소요됨
 -INDEX 필요 컬럼
  .자주 검색해야하는 컬럼
  .WHERE 절의 조건문에 '='연산자를 사용하여 특정 컬럼값을 비교하는 경우
  .PRIMARY/FOREIGN KEY 항목
  .JOIN에 자주 사용되는 컬럼

 
 - 인덱스의 구분
  . UNIQUE VS NON-UNIQUE INDEX(중복O,중복,NULL가능인 이유는 인덱스는 기본키가 아니므로...))
   -UNIQUE INDEX에 NULL도 허용되나 한번만 허용
  . SINGLE (한개의 컬럼값을 가지고 구성) VS COMPOSITE INDEX (여러개의 항목을) 
  . NORMAL INDEX
   -기본 인덱스, 검색트리 이용( 왼쪽 부모보다 작고, 오른쪽 부모보다 크고를 만족)
   -트리구조를 사용(검색횟수가 동일)
   -컬럼값과 ROWID(물리적 위치정보)를 기반으로 저장
  . BITMAP INDEX
   -CARDINALITY 가 작은경우 효율적인 INDEX 
   -컬럼값과 ROWID(물리적 위치정보)의 2진 조합을 기반으로 저장
  . FUNCTION-BASED NORMAL INDEX
   -인덱스 구성 컬럼에 함수가 적용된 형태 (ex.SUBSTR(X,2,5))
   -검색에 이 인덱스가 사용되는 경우 인덱스 구성에 사용된 함수와 
    동일 형태이어야만 효율적 검색을 확보할 수 있음

기본키로 설정하면 자동으로 인덱스가 만들어진다.

(사용형식)

  CREATE  [UNIQUE|BITMAP] INDEX 인덱스명
     ON  테이블명(컬럼명[,컬럼명,...]) [ASC|DESC]
    .'ASC|DESC' : 오름차순 또는 내림차순으로 인덱스 생성
      Default 는 ASC임


사용예)

   CREATE INDEX IDX_BUYER_NAME
       ON BUYER(BUYER_NAME);

 

SELECT *FROM BUYER
    WHERE BUYER_BANKNO='112-650-397811';

->처리되어지는 시간을 제대로 비교하기가 어렵다(데이터 자료가 많이 있지 않기 때문이다.)


CREATE TABLE T_SAMPLE AS
     SELECT*FROM CART,BUYPROD;

SELECT COUNT(*) FROM T_SAMPLE;

 SELECT *
     FROM T_SAMPLE
     WHERE BUY_PROD='P302000011';


 CREATE INDEX IDX_TSAMPLE
        ON T_SAMPLE(BUY_PROD);

인덱스를 생성하고찾으면 더 시간이 빨라진다.

 SELECT *
     FROM T_SAMPLE
     WHERE BUY_PROD='P302000011';


CREATE INDEX IDX_TSAMPLE02
        ON T_SAMPLE(SUBSTR(CART_NO,4));

함수를 사용했으므로 함수타입

 

 SELECT *
     FROM T_SAMPLE
    WHERE SUBSTR(CART_NO,4)='5072800004';

->32초 걸림


**인덱스 재생성
 -원본테이블의 자료 변경, 삽입, 삭제가 많이 발생 했을 때
 -원본테이블이 다른 저장공간(Table Space)으로 이동한 경우


 (사용한 경우)

 ALTER INDEX 인덱스명 REBUILD;

 

728x90