- 테이블 데이터 삽입(대량) 후 인덱스를 생성
- 올바른 테이블과 열 인덱스화
- 큰 테이블에서 15% 미만의 행을 자주 검색하는 경우 인덱스를 생성
- 다중 테이블 조인에 대한 성능을 향상하려면 조인에 사용되는 열을 인덱스화
- 작은 테이블은 인덱스가 필요 없음
- 열에서 값이 비교적 고유(유니크)
- 넓은 범위의 값(일반 인덱스)
- 작은 범위의 값(비트맵 인덱스)
- 열에 많은 널값이 있지만 query에서 값을 가진 모든 행을 종종 검색
- 열에 많은 널이 있고 not null 값에 대해 검색하지 않음
- LONG 및 LONG RAW 열은 인덱스화할 수 없음
- 가상 열
- 성능을 위해 인덱스 열의 순서 지정 : create index 문의 열 순서는 query 성능에 영향을 미칠 수 있음, 가장 자주 사용되는 열을 맨 앞에 지정
- 테이블당 인덱스 수 제한 : 테이블에는 임의 개수의 인덱스가 존재, 인덱스 수가 많을수록 테이블을 수정할 때 발생하는 오버헤드가 커짐, 테이블에서 데이터를 검색하는 속도와 테이블을 갱신하는 속도 사이에 절충점을 찾아야함
- 각 인덱스에 대한 테이블스페이스 지정 : 테이블과 인덱스에 동일한 테이블스페이스를 사용하면 테이블스페이스 백업과 같은 데이터베이스 유지 관리를 훨씬 더 편리하게 수행할 수 있음
- 인덱스 생성 병렬화 고려 : create index문에 nologging을 지정하면 인덱스를 만들고 최소 리두 로그 레코드를 생성할 수 있음, 이 인덱스는 아카이브되지 않으므로 인덱스를 생성한 후 백업을 수행
- alter index emp_ename_idx coalesce;
- alter index emp_ename_idx rebuild; -> 새로 만드는 것, 사용중일경우 불가능 -> online을 붙이면 가능
- alter index emp_ename_idx rebuild online nologging;
- 분석 : ERD
- 정규화(Normalization) - 1NF, 2NF, 3NF
- 설계 : 관계형 데이터베이스 table
- 구축
- from 절에 2개 이상의 테이블을 참조하는 것이 조인
- 조인 조건을 쓰는 이유는 두 테이블이 조인했을 때, 쓸모없는 데이터를 걸러내기 위함
- Nested Loop Join
- Driving 행 소스가 스캔됨
- 반환된 각 행이 Inner 행 소스에서 조회를 구동
- 조인 행이 반환
- outer의 값과 inner의 값을 비교하며 조인 조건과 일치하는 데이터를 출력하므로 작업이 모두 끝나지 않아도 일부를 먼저 보여줄 수 있음
- optimizer_mode를 first_rows_1 모드로 확인하면 좋음
- 더 작은 테이블을 outer table로 사용하지만 추가적인 조건이 있는 경우 달라질 수 있음
- join 컬럼에 index가 있는 table을 inner table 로 선정
- 행을 줄여줄 수 있는 비조인 조건이 있다면 그 테이블을 driving(outer)로 지정
- 부분 범위 처리
- IRS -> 좁은 범위
- Nested Loops Join : Prefetching
- 데이터 블럭을 불러올 때, 하나씩이 아니라 가까운 곳의 데이터 블럭도 읽어옴
- physical read(물리적)의 지연을 줄이기 위해 사용
- 사용하다가 효율성이 떨어진다고 판단되면 알아서 중단
- 실행계획이 바뀜
- Nested Loops Join : 11g 구현
- NLJ Batching 기법
- Nested Loop 위에 Nested Loop가 하나 더 생김
- 비교적 넓은 범위
- sort를 위해 PGA의 workarea 사용
- 자동 PGA관리로 workarea의 메모리를 조절하여 사용 가능
- 두 테이블을 sort 후에 데이터를 찾기 때문에 결과행이 많더라도 빠르게 원하는 값들만 가져올 수 있음
- outer가 상대적으로 덜 중요
- 양쪽 모두 sort하는 것이 부담되니 한쪽만 sort하여 다른 한쪽은 index를 사용할 수 있음
- 작은쪽 테이블을 outer로 설정
- outer table = hash table -> 해쉬맵을 그리는 테이블
- inner table = probe table
- 첫 번째 행을 읽어서 hash 함수에 넣으면 hash value가 나옴
- hash value를 hash map에 넣음, 다음 행 반복
- hash map에는 join된 결과처럼 데이터들이 저장됨
- equal join만 가능