1 데이터 사용량과 사용자들의 업무 프로세스를 분석한다.
데이터 사용량 분석
논리적 모델링이 끝난후 물리적 모델링으로 넘어 갔을때 관련된 테이블의 스키마의 구성이 끝난후
생성된 테이블들의 하루에 입력되는 데이터 건수와 조회되는 데이터 건수가 얼마가 되는지등을 분석하는것
사용자들의 업무 프로세스 분석
데이터를 조회할때 어떤 컬럼을 기준으로 조회/정렬 하는지
다른 테이블을 연관해서 데이터 조회 여부,
데이터 입력후 다른 테이블을 업데이트 하는것인지 등등
그 과정과 그와 관련된 프로세스를 분석하는것
2 클러스터드 인덱스의 사이즈는 적을수록 좋다.
클러스터드 인덱스가 존재하면 모든 넌클러스터드 인덱스의
리프레벨은 클러스터드 인덱스의 키값을 포인터 정보로 갖는다.
클러스터드 인덱스의 사이즈는 넌클러스터드 인덱스의 사이즈에 영향을
끼치기 때문에 클러스터드 인덱스의 사이즈는 적을수록 좋다.
예) 클러스터드 인덱스의 사이즈가 10Byte 이면 모든 넌클러스터드 인덱스의 리프레벨은
10Byte의 클러스터드 인덱스의 키값을 포인트 정보를 갖게 된다.
※ 모든 인덱스의 사이즈는 작으면 작을수록 좋다!
3 한 테이블에 컬럼의 숫자는 많아야 10개 내외가 될 수 있도록 디자인 하자.
컬럼의 숫자가 많아지면 ROW의 길이기 길어지기 때문에 데이터 입력시
여러개의 페이지가 사용되어지기 때문에 물리적 I/O 성능이 떨어지게 된다.
그리고 컬럼의 숫자가 많아지면 하나의 테이블에 많은 데이터가 존재하기 때문에
관련된 프로세스를 처리하다보면 서로 연관성이 있는 컬럼을 엑세스하면서 프로세스가 집중될수 있다.
프로세스가 집중되다 보면 DEAD LOCK이 발생할 가능성이 높아진다.
4 복합 인덱스(Composite Index)의 경우 컬럼의 순서를 고려하자.
복합 인덱스일때 인덱스의 첫번째 컬럼으로 데이터가 정렬된다.
INDEX(컬럼A, 컬럼B)와 INDEX(컬럼B, 컬럼A)는 전혀 다른 인덱스이다.
INDEX(컬럼A, 컬럼B)는 컬럼A를 기준으로 정렬되며 INDEX(컬럼B, 컬럼A)는 컬럼A를 기준으로 정렬된다.
복합 인덱스를 생성하는 기준은 데이터 조회시 어떤 기준으로 조회하는지를 확인 후 결정한다.
복합 인덱스에서 첫번째 컬럼의 길이가 짧을수록 검색 성능은 좋아진다.
5 커버드 쿼리(Covered Query)를 적용하자.
조회 조건과 조회의 대상이되는 컬럼이 모두 인덱스로 구성되어 있는 쿼리를 커버드 쿼리라고 한다.
예) 회원 테이블에서 회원인증을 할때
SELECT 회원ID FROM 회원 WHERE 회원ID = 회원ID AND 비밀번호 = 비밀번호
CREATE INDEX 회원인증_IDX ON DBO.회원(회원ID, 비밀번호)로 인덱스 생성를 생성하면
WHERE 조건과 조회 대상이 되는 컬럼이 인덱스로 구성되어 있기 때문에
데이터 조회시 인덱스의 리프레벨에서 관련된 프로세스를 모두 처리할 수 있기 때문에
처리 속도가 빠르다.
※ 회원 테이블에서 회원인증을 할때 회원정보다 같이 가져와야 한다면
2005의 INCLUDE 기능을 사용하는것이 좋다. 이경우도 커버드 퀴리에 속한다.
SELECT 회원ID, 이름, 회원등급 FROM 회원 WHERE 회원ID = 회원ID AND 비밀번호 = 비밀번호
CREATE INDEX 회원인증_IDX ON DBO.회원(회원ID)
INCLUDE (비밀번호, 이름, 회원등급)
6 파일 그룹(File Group)을 활용하자.
성능상의 이슈와 관리상의 이슈를 해결하기 위해서 파일 그룹을 사용한다.
사용자가 원하는 테이블이나 인덱스(데이터 베이스내에서 사이즈를 가지고 있는 테이블이나 인덱스)를
사용자가 원하는 파일 그룹에 위치시켜 관리할수 있고 파일 그룹단위로 백업/복원을 할수 있기 때문에
대용량 데이터베이스를 관리하는 솔루션이 될수 있다.
파티션 테이블, 파티션 인덱스를 구성할 수 있다.
파티션 테이블
하나의 테이블을 여러개의 파일 그룹으로 구성하면 데이터가 각각의 파일 그룹으로 분산되기 때문에
테이블에 걸리는 로드가 각각의 파일그룹으로 분산되어진다.
파티션 인덱스
파티션 테이블에 인덱스를 생성하는 경우
하나의 큰 인덱스를 생성하게되면 인덱스의 뎁스(단계)가 높아지지만
파티션 인덱스는 인덱스의 뎁스가 낮고 인덱스 검색시 속도가 빠르다.
7 인덱스를 잘 활용할 수 있도록 쿼리를 작성하자.
- 인덱스가 정의된 컬럼을 가공하면 안된다.
CREATE INDEX 판매_IDX ON DBO.판매(판매량) 으로 인덱스를 생성했을때
Query 1) SELECT 회원ID FROM 판매 WHERE 판매량 = 50
Query 2) SELECT 회원ID FROM 판매 WHERE 판매량 + 5 = 45
두쿼리의 결과는 같지만 Query 1)은 인덱스를 타지만 Query 2)는 인덱스를 타지 못한다.
- LIKE 검색시 검색단어앞의 %는 사용하지 않는다.
CREATE INDEX 회원인증_IDX ON DBO.회원(회원ID) 으로 인덱스를 생성했을때
Query 1) SELECT 회원ID FROM 회원 WHERE 회원ID LIKE '회원ID%'
Query 2) SELECT 회원ID FROM 회원 WHERE 회원ID LIKE '%회원ID%'
위의 두 쿼리도 Query 1)은 인덱스를 타지만 Query 2)는 인덱스를 타지 못한다.
8 클러스터드 인덱스를 생성할때는 주의 해야한다.
※ 순차적으로 입력되는 컬럼에 클러스터드 인덱스를 만든다.
판매 기록 테이블이 있을때
상품코드, 구매자번호, 판매일자 컬럼중 클러스터드 인덱스를 생성할 컬럼을 선택한다면?
답은 판매일자!
- 상품코드 컬럼에 클러스터드 인덱스를 생성
판매 기록 테이블의 모든 데이터가 상품코드 컬럼을 기준으로 정렬되어 진다.
상품코드A
상품코드B
상품코드C
상품코드D
상품코드E
이렇게 정렬되어 있는 상황에서 상품코드B의 판매 기록이 입력되면 상품코드 컬럼을 기준으로
데이터를 다시 정렬해야 하기 때문에 부하가 크다.
- 구매자번호 컬럼에 클러스터드 인덱스 생성
판매 기록 테이블의 모든 데이터가 구매자번호 컬럼을 기준으로 정렬되어진다.
구매자1
구매자2
구매자3
구매자4
구매자5
이렇게 정렬되어 있는 상황에서 구매자2가 판매 기록이 입력되면 구매자번호 컬럼을 기준으로
데이터를 다시 정렬해야 하기 때문에 부하가 크다.
- 판매일자 컬럼에 클러스터드 인덱스 생성
판매일자는 그날그날 판매되는 날짜이기 때문에 갑자기 하루나 몇일전의 판매 기록이 입력되는 일이 없다면
데이터를 다시 정렬할 상황이 없다.
※ 클러스터드 인덱스를 만들만한 컬럼이 없다면 일련번호 컬럼(자동 증가열)에
클러스터드 인덱스를 만드는것도 좋은 방법이다.
이올린에 북마크하기