카테고리 없음

sql index생성, index 구조와 이해

boangod 2025. 9. 25. 17:38

인덱스(Index) 생성, 인덱스 구조와 이해

 

인덱스 = 색인

 

• 인덱스종류

‐ 고유

     고유인덱스(Unique Index), 비 고유 인덱스( Non unique Index)

‐ 물리구조

     B-Tree Index, bitmap Index

 

 

• 인덱스생성

‐ 자동생성

     . PK, UK로 지정된컬럼은자동으로생성된다.

     . Unique Index가 생성된다.

‐ 수동생성

     . CREATE INDEX 명령을 통해 직접 생성한다.

     . Non unique Index 가 생성된다.

     . FK 컬럼에반드시생 성한다.

 

데이터가 너무 많으면 사용 안 한다.

 

 

 

Index 생성과 삭제

 

CREATE INDEX 인덱스

ON 테이블 (컬럼 | 함수 | 수식);

 

DROP INDEX 인덱스;

 

 

  • 인덱스생성조건
    ‐ 전체데이터의 10%~15% 정도의 데이터를 검색하는 경우
         . 검색데이터가 한 번에 확인이 가능한 정도라면의미가 있다.
    ‐ WHERE 절이나 조인에 사용되는 컬럼
    ‐ 데이터의 행이 매우 많은 경우

 

 

Index 확인

 

SELECT c.index_name, c.column_name, c.column_position,

i.uniqueness

FROM user_indexes i, user_ind_columns c

WHERE c.index_name = i.index_name;

 

SELECT index_name, column_expression

FROM user_ind_expressions;

 

‐ mn_position : 여러 컬럼으로 인덱스가 생성된 경우 컬럼의순서

‐ Column_expressions : 수식에 의해 만들어진 인덱스의 해당 수식

 

제약조건을 추가하고 Index 확인

‐ school_con.sql 파일을 실행하고 인덱스를 확인한다.

 

SELECT i.table_name, i.index_name, c.column_name,

c.column_position, i.uniqueness

FROM user_indexes i, user_ind_columns c

WHERE c.index_name = i.index_name

AND i.table_name IN ('STUDENT', 'PROFESSOR', 'COURSE', 'SCORE')

ORDER BY i.table_name;

 

PK(UK)에 의해서 자동으로 생성된 인덱스의 이름은 PK(UK)와 동일하다.

‐ SCORE 테이블의 PK는 SNO, CNO컬럼으로 구성되어 컬럼의 순서가 매우 중요하다.

 

 

인덱스생성

• STUDENT 테이블에 다양한 인덱스를 생성하고 조회

 

CREATE INDEX student_sname_indx

ON student (sname);

 

CREATE INDEX student_major_sname_indx

ON student (major, sname);

 

CREATE INDEX student_coavr_indx

ON student (avr*4.5/4.0);

 

CREATE INDEX pr_ord_indx

ON professor (SUBSTR(orders,1,1));

 

카디날리티가 낮은 놈이 앞으로 높은 놈은 뒤로 만든다.

‐ 여러 컬럼으로 인덱스가 만들어질 때 구조는 해당컬럼으로 정렬하는 경우 와동일하다.

‐ 인덱스는 컬럼뿐 아니라 수식으로도 생성가능하다.

 

 

==================

alter table score add constraint score_pk primary key (sno,cno);

create index score_cno_fk on score(cno);

pk는 만들어질 때 자동으로 index가 만들어지는데

이미 sno로 index가 만들어지기 때문에

cno만 만들면 된다.

====================

테이블을 다 만들고 인덱스 만들어준다.

 

 

 

인덱스확인

• STUDENT 테이블의 인덱스를 확인

 

SELECT c.index_name, c.column_name, c.column_position

FROM user_indexes i, user_ind_columns c

WHERE c.index_name = i.index_name

AND c.table_name = 'STUDENT'

ORDER BY c.index_name, c.column_position;

 

SELECT index_name, column_expression

FROM user_ind_expressions

WHERE index_name = 'STUDENT_COAVR_INDX';

 

수식을 이용한 인덱스의 경우 COLIMN_NAME의 값이 일련번호로 검색된다.

‐ 수식은 USER_IND_EXPRESSIONS에서 검색한다.

 

 

인덱스삭제

DROP INDEX student_major_sname_indx;

DROP INDEX student_sno_pk;

ㄴ pk를 디스에이블, 드롭하면 자동으로 지워진다.

 

 

view

 

  • 뷰의 종류
    ‐ 단순뷰(Simple view)
         . DML문장수행가능
    ‐ 복합뷰(Complex view)
         . 다중테이블이나 수식 등이 포함된 뷰

 

view는 테이블처럼 똑같이 사용가능

세그먼트가 아님.

아이콘 같은 느낌이다.

view는 보통 select만 한다.

반드시 서브쿼리를 사용해서 만든다.

 

 

 

view 생성

 

CREATE [OR REPLACE][FORCE | NOFORCE] VIEW 뷰 (컬럼 ... )

AS (SELECT 문장 : sub query)

[WITH CHECK OPTION [CONSTRAINT constrant_name]] 

[WITH READ ONLY [CONSTRAINT constrant_name]]; 

 

‐ OR REPLACE

     : ALTER VIEW를 대체한다.

     : SEGMENT가 아님

‐ FORCE

     : 기반 테이블 없이 쀼를 생성한다.

‐ WITH CHECK OPTION

     : 뷰에 의해서 검색가능한 행만 DML 작업이 가능하도록 제약한다.

‐ WITH READ ONLY

     : 뷰를 통해서는 SELECT만 가능하도록 제한한다.

 

생성 예)

create view sno_sname

as select sno,sname from student;

ㄴ 보일 때 sno, sname을 가진 테이블로 보인다.

 

 

view는 테이블에 액세스하는 소프트링크? 같은 거

ㄴ 복잡한 sql문을 쉽게 액세스할 수 있게 만들어주는 거.

 

view 삭제와 확인

 

DROP VIEW 뷰;

SELECT view_name, text FROM user_views; → view이름 보기

 

‐ text : 뷰 생성 서브쿼리

     : LONG 타입으로 설정이 필요하다. → 크기를 조절해서 봐야 함.

 

view 생성 주의사항

‐ 뷰를 생성할 수 있는 'CREATE VIEW' 권한이 보통은 RESOURCE, CONNECT 롤에 포함되어 있지 않음으로 사용자에게 반드시 해당 권한을 할당해야 한다.

‐ 사용자에게 직접 할당하거나 할당된 RESOURCE, CONNECT 롤에 할당한다.

 

 

view 생성

일반화학과목의학과 별기말고사평균을 뷰로생성

 

CREATE VIEW ma_result (과목번호, 과목명, 학과, 기말고사평균)

AS SELECT c.cno, cname, major, ROUND(AVG(result))

FROM student s, course c, score r

WHERE s.sno=r.sno AND r.cno=c.cno

AND cname='일반화학' GROUP BY c.cno, cname, major;

 

SET LONG 1000 ← 1000 byte까지 출력

SELECT view_name, text FROM user_views;

DESC ma_result;

SELECT * FROM ma_result;

 

 

WITH CHECK 옵션

 

CREATE VIEW st_ch

AS SELECT sno, sname, syear, avr

FROM student

WHERE syear = 1;

 

INSERT INTO st_ch VALUES ('000001', '시현', 2, 4.0);

SELECT * FROM student WHERE sname = '시현';

SELECT * FROM st_ch WHERE sname = '시현'; ← 검색되지 않는다.

• 뷰에 보이지않는행이뷰를 통해 입력될 수 있다.

 

 

인라인뷰(Inline View)

 

SELECT ...

FROM (SELECT 문장 : sub query) [별명]

 

‐ 인라인뷰는 FROM절에 쓰인 서브쿼리다.

‐ 인라인뷰는 문장이 실행되는 동안만 존재하는 뷰이다.

‐ 인라인뷰는 일반뷰와 동일하게 조인이나 검색에 이용된다.

 

 

인라인뷰사용

• 각 부서별 최소급여자를 검색

 

SELECT eno, ename, d.dno, sal, msal

FROM emp e,

(SELECT dno, MIN(sal) msal FROM emp

GROUP BY dno) d

WHERE e.dno = d.dno

AND sal = msal;