쿼리를 작성할때 DB서버의 설정, 데이터 용량 및 분포, 인덱스 상황 등을 종합적으로 생각하고
쿼리를 작성해야한다.
1. Select * from table 문장 삼가
쿼리의 결과로 모든 필드(데이터컬럼: column)의 결과가 필요한 경우가 아니라면
Select 리스트에 필요한 필드들을 일일이 적어 주어야한다.
전체를 가져올경우에도 적어주는것이 퍼포먼스에는 성능이 좋다.
* 로 검색할 경우 퍼포먼스가 떨어지는 이유는 메모리 공간을 많이 잡아먹기때문이며, 네트워크로 웹서버와 디비 서버가 연결되어 있기때문에 불필요한 데이타까지 반환되기때문이다.
또한 정작 가져와야 할 데이타 보다 불필요한 데이타의 양이 더 크다면 배보다 배꼽이 더 큰 문제가
되기때문에 네트워크 패킷을 구성해서 네트워크 라인을 돌아다니게 된다.
2. 알맞은 인덱스를 구성해서 쿼리가 인덱스를 타도록 구성
DB서버 튜닝을 한다는것은 쿼리 튜닝을 한다는 것에 초점이 있고 쿼리 튜닝을 한다는 것은 알맞은
인덱스를 타게 하는데에 그 초첨이 있다.
1) 인덱스의 정의
책의 끝 부분에 나오는 인덱스(index;색인,찾아보기)가 그 책에서 사용된 주요 단어를 '가나다라'
또는 'ABCDEF' 순으로 정렬하고 그 단어가 나타나는 페이지 번호를 정리해둔 것과 같이 DB서버의 인덱스도 이와 유사한 개념이다.
DB서버에서 사용되는 인덱스는 지정된 필드를 기준으로 필드가 담고있는 데이터의 위치 정보를
오름차순(ASC) 혹은 내림 차순 (DESC) 으로 정렬 해 둔 것이다.
2) 인덱스의 필요성
책의 내용을 하나씩 뒤지는 것 보다 원하는 단어를 빠르게 찾을 수 있도록 하기 위한 것이다.
효율적으로 인덱스를 구성하고 사용한다면 쿼리의 속도를, 그리고 궁극적으로는 DB서버의 퍼포먼스를 놀라울 정도로 향상시킬 수 있다.
하지만 인덱스를 사용하는것이 항상 좋다고만 할 수 없는 경우가 있다.
예를들어 찾아야 하는 단어의 개수가 많고 책 속에서 그 단어들이 나타나는 페이지도 매우 많은경우라면 인덱스를 보고 찾는 것보다는 오히려 책의 내용을 처음부터 차근 차근 읽어면서 단어를 찾는 편이 일일이 인덱스를 펼쳤다가 페이지를 펼쳤다가 하는 것보다 빠를 수 있다.
이러한 원리 역시 DB서버에서도 그대로 적용된다.
3) 인덱스의 종류
3-1) 클러스터드 인덱스
MS-SQL 서버의 인덱스를 기준으로 설명
정렬기준 필드가 클러스터드 인덱스의 정렬 기준 필드와 같고 쿼리가 클러스터드 인덱스를 탄다면 굳이 쿼리에 Order by 절을 넣지 않아도 데이터가 정렬되엇 반환된다. 따라서 DB서버 내부적으로는 'Order by' 절을 처리하는 작업이 줄어 들게 할 수 있으므로 퍼포먼스 향상에 도움이 된다.
한계)
데이터가 자주 업데이트 되거나 삽입되는 테이블에 대한 Select쿼리가 클러스터드 인덱스를 타는 경우에는 넌클러스터드 인덱스를 타는 경우보다 퍼포먼스가 더 느려질 수 있다.
왜냐하면 클러스터드 인덱스는 실제 데이터를 정렬하는 인덱스이므로 데이터가 업데이트나 삽입될때마다 DB서버가 바뀐 데이터를 정렬하는 작업을 하기 때문이다.
넌클러스터드 인덱스는 한 테이블에 대해서 여러 개아 가능한 반면 클러스터드 인덱스는 테이블 한개에 대해서 한개만 존재할 수 있다. 왜냐하면 앞에서 설명했듯이 클러스터드 인덱스는 하나의 클러스터드 인덱스 정렬 기준에 의해 실제 데이터가 정렬되어 있기 때문에 또 다른 기준을 두어서 이미 정렬되어 있는 실제 데이터를 다르게 정렬하는 것이 가능하지 않기 때문이다.
3-2) 넌클러스터드 인덱스
두 클러스트의 차이는 단지 클러스터드 인덱스가 넌클러스터드 인덱스보다 인덱싱 단계가 한단계 적다는 것
클러스터드 인덱스는 실제 데이터(데이터의 물리적인 위치를 가리키고 있는 최종 오프셋(Offset) 포인터들)가 정렬되어 있기때문이다. 즉 실제 데이터가 인덱스의 정렬 기준에 의해서 이미 정렬되어 있기 때문에 1 : 1 로 데이터 하나하나가 어디에 있는지에 대한 최종포인터 정보를 담고 있는 최종 인덱싱 단계가 필요없다. 바로 이 최종단계가 있느냐 없느냐에 따라서 클러스터드 인덱스와 넌 클러스터드 인덱스로 구분되는 것이다.
'DB' 카테고리의 다른 글
ORACLE 쿼리 분석(실행계획) (0) | 2014.11.28 |
---|---|
ORACLE HINT (0) | 2014.11.28 |
그림자 페이징 기법 (0) | 2014.10.18 |
ACID (0) | 2014.10.17 |
DB 정규화 (0) | 2014.10.17 |