인덱스
SQL 실행 계획
- SQL Developer에서 SQL 구문에 F10 키를 누르거나 다음 명령을 실행
EXPLAIN PLAN FOR SELECT * FROM TB_COMPANY_MASTER; -- 실행 계획 생성
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); -- 실행 계획 보기
OPTIONS: 처리 방법(FULL: 테이블 전체를 스캔)CARDINALITY: 예상되는 실행 결과 행 수 (실제 결과와 크게 다를 경우 질의가 비효율적)COST: 예상되는 실행 비용 (비용이 높으면 질의가 비효율적)- 실제 실행은 역순으로 이뤄짐(하위 실행의 결과가 모여서 상위 실행 결과가 됨)
옵티마이저(Optimizer)
- 사용자가 입력한 구문을 최적화해주는 부분
- 비용 기반 옵티마이저:
- 수많은 '후보 실행 계획'을 생성 (예: A->B NL Join, B->A Hash Join...)
- 통계 정보(
Statistics) 를 바탕으로 각 계획의 비용(Cost) 을 추정 - 가장 비용이 낮은 계획을 최종 선택
옵티마이저 작동 예시
- 서브쿼리
SELECT * FROM
(SELECT * FROM TB_COMPANY_MASTER WHERE HQ_ADDRESS LIKE '%강남구%')
WHERE LISTING_DT > '1990-01-01';
- 실제로는
AND조건으로 결합해서 한 번에 검색
(실행 계획 예시)
TABLE ACCESS (FULL)
Filter Predicates: AND
HQ_ADDRESS LIKE '%강남구%'
LISTING_DT > '1990-01-01'
인덱스(index)
- 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조
- 장점
- 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있음
- 전반적인 시스템의 부하를 줄일 수 있음
- 단점
- 인덱스를 관리하기 위해 DB의 저장공간이 필요
- 데이터 변경 시 인덱스도 변경되어야 하므로 추가 작업이 필요
- 잘못 사용하면 오히려 성능이 저하
- 인덱스가 있거나 없어도 SQL 문의 실행 결과는 같음(속도만 달라짐)
- 같은 의미면 인덱스를 사용하여 속도를 높일 수 있도록 질의 작성
인덱스의 자료 구조
- 분기(
branch) 블록: 검색을 위한 용도 - 잎(
leaf) 블록: 키 값(rowid)을 저장
인덱스 정보 보기
TB_COMPANY_MASTER의 인덱스 보기
SELECT
INDEX_NAME, -- 이름
INDEX_TYPE, -- 유형
UNIQUENESS -- UNIQUE 여부
FROM ALL_INDEXES
WHERE TABLE_NAME = 'TB_COMPANY_MASTER';
| INDEX_NAME | INDEX_TYPE | UNIQUENESS |
|---|---|---|
| IDX_COMPANY_NM | NORMAL | NONUNIQUE |
| IDX_COMPANY_EST_DT | NORMAL | NONUNIQUE |
| IDX_COMPANY_COVER_CAT_NM | NORMAL | NONUNIQUE |
| IDX_COMPANY_CEO_UPPER | FUNCTION-BASED NORMAL | NONUNIQUE |
| PK_COMPANY_MASTER | NORMAL | UNIQUE |
| SYS_C008505 | NORMAL | UNIQUE |
인덱스를 구성하는 컬럼
TB_COMPANY_MASTER의 인덱스를 구성하는 컬럼 보기
SELECT
INDEX_NAME, -- 인덱스 이름
COLUMN_NAME, -- 컬럼 이름
COLUMN_POSITION -- 인덱스에서 컬럼의 순서
FROM ALL_IND_COLUMNS
WHERE TABLE_NAME = 'TB_COMPANY_MASTER'
ORDER BY INDEX_NAME, COLUMN_POSITION;
| INDEX_NAME | COLUMN_NAME | COLUMN_POSITION |
|---|---|---|
| IDX_COMPANY_CEO_UPPER | SYS_NC00019$ | 1 |
| IDX_COMPANY_COVER_CAT_NM | COMPANY_TYPE_CAT | 1 |
| IDX_COMPANY_COVER_CAT_NM | COMPANY_NM | 2 |
| IDX_COMPANY_EST_DT | ESTABLISH_DT | 1 |
| IDX_COMPANY_NM | COMPANY_NM | 1 |
| PK_COMPANY_MASTER | BIZ_REG_NO | 1 |
| SYS_C008505 | COMPANY_CD | 1 |
퀴즈
사용자 정보 입력
퀴즈를 시작하기 전에 이름과 소속을 입력해주세요.