16장 오라클 인덱스의 의미 및 총 정리 (조회 속도 비교,인덱스 정의, 사용 방법)
안녕하세요 jju_developer입니다.
오늘은 오라클의 인덱스의 의미 및 총정리 (조회 속도 비교, 인덱스 정의, 사용 방법)에 대해 소개하는 시간을 갖겠습니다.
✔ 목차
- 인덱스란?
- 인덱스 정보 조회
- 조회 속도 비교하기
- 인덱스 생성 및 제거하기
- 인덱스를 사용해야 하는 경우 판단하기
✔ 인덱스의 개요?
데이터베이스를 빠르게 찾기 위한 하나의 자료구조입니다.
우리가 데이터를 찾아가는 방법 중 빠른 방법에 대한 여러 가지 알고리즘이 있습니다.
인덱스란 SQL 명령문의 처리 속도를 향상하기 위해서 칼럼에 대해서 생성하는 오라클 객체입니다.
인덱스 장점 | 인덱스 단점 |
• 검색 속도가 빨라진다. • 시스템에 부하를 줄여서 시스템의 전체 성능을 향상시킵니다. • 데이터베이스의 모든 블록을 다 읽지 않고, 목표 데이터가 있는 블록 주소를 찾아 당해 블록만을 메모리에 복사하여 작업을 진행합니다. |
• 인덱스를 위한 추가 공간이 필요하다. • 인덱스가 많거나 / 있다고 하여 무조건 쿼리 속도가 빨라지지 않습니다. - 테이블과 연관된 인덱스가 많을수록 오라클 서버 부담 증가 |
데이터가 위치한 장소의 정보를 가진 일종의 주소록입니다.
인덱스는 데이터의 주소(ROWID)를 가지고 있습니다.
결과적으로 인덱스는 데이터 검색을 빠르게 하기 위한 자료구조로 만드는 것 을 의미합니다~!
✔ 인덱스 정보 조회하기
기본적으로 오라클에서 제공되는 EMP와 DEPT의 테이블은
PK로 만들어진 DEPTNO와 EMPNO가 있기 때문에
이 둘의 인덱스가 있습니다.
✔ 인덱스 조회 속도 비교
인덱스가 아닌 칼럼으로 검색해보겠습니다.
INSERT INTO EMP01
SELECT * FROM EMP01;
자기 자신을 EMP01에 여러 번 더블 클릭하여 넣습니다.
여러 번 클릭하여 데이터가 많아지도록 합니다.
테이블 자체 복사를 여러 번 반복해서 상당히 많은 양의 행을 생성한다.
이 정도로 많이 테이블을 생성 후,
SET TIMING ON --타이밍 설정
SELECT DISTINCT EMPNO, ENAME
FROM EMP01
WHERE ENAME = 'SES'; --'SYS'테이블 검색 속도 확인하기
SET TIMING ON 을하여,
방금 넣은 데이터가 몇 초 정도 걸리는지 확인합니다.
그렇다면 인덱스를 설정하면 어떻게 될까요?
인덱스 설정하기
CREATE INDEX IDX_EMP01_ENAME
ON EMP01(ENAME);
내가 만든 테이블에 인덱스를 CREATE 하는 것입니다.
이미 많은 테이블이 있기 때문에 인덱스 자체를 생성할 때에 시간이 어느 정도 소요됩니다.
이후에 속도를 동일하게 비교를 하면
속도 차이가 나는 것을 볼 수 있습니다.
이처럼 인덱스를 사용하는 경우를 잘 판단하여야 합니다.
✔ 인덱스 생성 및 제거하기
-- 인덱스 생성하기
CREATE INDEX IDX_EMP01_ENAME
ON EMP01(ENAME);
SELECT DISTINCT EMPNO, ENAME
FROM EMP01
WHERE ENAME='SYJ';
--인덱스 있는지 확인
SELECT INDEX_NAME, TABLE_NAME , COLUMN_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME IN('EMP01');
--인덱스 제거하기!!
DROP INDEX IDX_EMP01_ENAME;
인덱스 생성 시,
CREATE INDEX를 하고 나서 뒤에는 인덱스 이름_테이블 이름_칼럼 이름 하면 이게 이제 인덱스 이름입니다.
ON 테이블 (칼럼 이름);
ON 뒤에 오는 테이블과 칼럼 이름은 제가 지정한 인덱스 이름과 동인 한 테이블과 칼럼 이름을 넣어주면 됩니다~!
✔ 인덱스를 사용해야 하는 경우 판단하기
no | 인덱스를 사용해야 하는 경우 | 인덱스를 사용하지 말아야 하는 경우 |
1 | 테이블에 행의 수가 많을 때 | 테이블에 행의 수가 적을 때 |
2 | WHERE 문에 해당 컬럼이 많이 사용될 때 (where문을 쓴다는 것은 조회를 하기 위한 조건이기 때문입니다.) |
WHERE 문에 해당 컬럼이 자주 사용되지 않을 때 |
3 | 검색 결과가 전체 데이터의 2%~4% 정도 일 때 | 검색 결과가 전체 데이터의 10%~15% 이상 일 때 |
4 | JOIN에 자주 사용되는 컬럼이나 NULL을 포함하는 컬럼이 많은 경우 | 테이블에 DML 작업이 많은 경우 즉, 입력 수정 삭제 등이 자주 일어 날 때 -> 데이터 수정이 잦은 경우에는 인덱스를 활용하지 않는 것이 좋습니다. |
다음과 같은 조건에서 사원 테이블의 부서 번호(DEPTNO)에 인덱스를 거는 것이 좋을까요?
• 테이블에 전체 행의 수는 10000 건이다.
• 위의 쿼리문을 전체 쿼리문들 중에서 95% 사용된다.
• 쿼리 문의 결과로 구해지는 행은 10건 정도이다.
=> 조건을 위 표를 비추어보고 판단해 보면 부서 번호(DEPTNO) 칼럼을 인덱스로 사용하기에 알맞다는 결론이 납니다.
이처럼 데이터를 보고 개발자가 판단하여 인덱스를 활용하셔야 합니다.
여기까지 인덱스의 기초 설명을 마치겠습니다.
그럼 오늘도 수고하셨습니다~! :)