SQL 첫걸음(ch29. 인덱스 작성과 삭제 ~ ch30. 뷰 작성과 삭제)

김도형·2022년 10월 14일
0
post-thumbnail

29장 인덱스 작성과 삭제

문법

CREATE INDEX
DROP INDEX

인덱스 작성과 삭제 과정을 정리해봤다.

인덱스 작성

sample62 no열을 가지고 isample65 인덱스 테이블 만들었다.

데이터 베이스 제품에 따라 객체의 범위가 다르다. 크게 2가지이다.

  • Oracle, DB2
    • 인덱스는 스키마 객체
    • 스키마 내에서 이름 중복이 되면 안됨.
  • MySQL, SQL Server
    • 인덱스는 테이블 객체
    • 테이블 내에서 이름 중복이 되면 안됨.

또한 복수 열을 지정 가능하다.

문법

CREATE INDEX 인덱스명 ON 테이블명(열명1, 열명2...)

인덱스 삭제

isample65 인덱스 테이블을 단순히 삭제하는 것이다.

그런데 아까 데이터베이스 제품마다 범위가 다르다고 했는데 여기서도 제품마다 문법이 상이하다.

스키마 객체 경우(Oracle, DB2)

DROP INDEX isample65;

테이블 내 객체의 경우(SQL Server, MySQL)

DROP INDEX isample65 ON sample62;

INSERT 처러 시, 처리 속도 떨어짐.

제목과 마찬가지로 처리 속도가 떨어진다. 왜냐하면 최신 상태로 갱신하는 자리가 늘어나기에 다시 연산해야하기 때문이다.

인덱스가 적용되지 않는 경우

WHERE 구의 조건식이 맞지 않으면, 인덱스는 사용되지 않는다.(이 부분은 헷갈려서 혹시 틀릴 경우 댓글 달아주세요)

EXPLAIN

인덱스 사용여부 확인이다.

문법

EXPLAIN SQL 명령

SQL 명령은 실제로 실행되지는 않는다.
단, MySQL인 경우 상황에 따라 일부 실행되는 경우도 발생

그럼 인덱스 사용여부에 따라 예시를 보여주면,

인덱스 사용

출처 : SQL 첫걸음 아사이 아츠시 지음 [한빛미디어] p.260

인덱스 미사용

출처 : SQL 첫걸음 아사이 아츠시 지음 [한빛미디어] p.261

최적화

인덱스 사용 여부는 서로 다른 데이터 값이 많이 존재하는가에 달렸다
예시로 "예" "아니오" 로 구성된 열을 이진트리로 구성하면 비효율적이다.


30장 뷰 작성과 삭제

뷰의 특징은

  • SELECT 명령 이름 지정불가
  • 데이터베이스에 등록되지 않음
  • CPU 자원을 사용
  • 테이블과 달리 대량의 저장공간 필요 없음
  • 그러한 이유는 SELECT 명령뿐이라서
  • 그래서 뷰는 SELECT 명령을 기록하는 데이터베이스 객체
  • 실행 결과는 일시적 보존, 참조할 때마다 SELECT 명령이 실행

문법

CREATE VIEW 뷰명 AS SELECT 명령
DROP VEIW 뷰명

뷰를 사용하는 이유

WHERE 구, GROUP BY 구 집계등으로 복잡한 명령을 SELECT 명령을 간략하게 표현

뷰 사용 전

SELECT * FROM (SELECT * FROM sample54) sq;

뷰 사용 후

SELECT * FROM sample_view67 sq;

가상 테이블

  • 뷰는 테이블처럼 취합하지만 '실체 없음'
  • 즉, 가상테이블이다.
  • SELECT 명령으로 이루어진 뷰는 테이블처럼 변경에 대한 저장공간을 가지고 있지 않음.

뷰 작성과 삭제

뷰 작성

문법

CREATE VIEW 뷰명 AS SELECT 명령 

CREATE VIEW sample_view_67 AS SELECT SELECT * FROM sample54;

뷰 여러 열 지정

문법

CREATE VIEW 뷰명(열명1, 열명2...) AS SELECT 명령 

CREATE VIEW sample_view_67(n, v, v2) AS SELECT no, a, a*2 FROM sample54;

뷰 삭제

문법

DROP VIEW 뷰명

DROP VIEW sample_view_67;

뷰의 약점

  1. 데이터양이 많거나 집계처리할 경우, 뷰 중첩 사용하는 경우 처리속도가 떨어짐.
  2. 부모 쿼리와 연관된 서브쿼리의 경우 뷰의 SELECT 명령을 실행할 수 없다.
    그러한, 이유는 SELECT 명령으로 단독 실행되기 때문에.

머티리얼라이즈드 뷰

1번 약점을 보완한다.

  • 데이터를 일시적으로 저장했다가 쿼리가 실행 종료 될 때 함께 삭제
  • 일반적인 뷰처럼 매번 SELECT 실행할 필요 없다.
  • 단, 테이블 변경 시, SELECT 명령을 재실행 후 데이터 다시 저장
  • 데이터가 자주 변경되지 않은 경우에 뷰의 약점을 보완가능
  • MySQL에 사용불가
  • Oracle와 DB2에서만 사용 가능

함수 테이블

2번 약점을 보완한다.

  • 함수를 사용하여 함수에 인수를 지정할 수 있기 떄문에 인수의 값에 WHERE 조건을 붙여 결과값을 바꿀 수 있음.
  • 그래서 상관 서브쿼리처럼 동작 가능

출처 : SQL 첫걸음 아사이 아츠시 지음 [한빛미디어]

profile
3년간 웹/앱, 자동제어 QA 🔜 개발자로 전향하여 현재 교육 회사에서 백엔드 개발자로 근무 중입니다.(LinkedIn : https://www.linkedin.com/in/dohyoung-kim-5ab09214b)

0개의 댓글