sub_title
 MSSQL
제   목 MS-SQL 클러스터드 인덱스를 어떤 컬럼(들)에 생성하는 것이 유리할까?
작성자 마카로니 등록일 2009-01-08 02:44:06 조회수 30,015
클러스터드 인덱스를 어떤 컬럼(들)에 생성하는 것이 유리할까?
===========================================================

Sparse Index와 Dense Index의 개념은 다음과 같다.

- Sparse Index: 해당 레코드 존재 페이지를 가리키는 포인터를 저장
- Dense Index: 해당 레코드를 가리키는 포인터를 저장
- Heap : 데이터가 입력되는 순서에 따라 정렬되어 쌓이는 테이블 구조

MS-SQL Server에서는 Sparse Index를 클러스터드 인덱스라고 부르고, Dense Index를
논클러스터드 인덱스라고 부른다. DB2(UDB), Oracle은 Dense Index만을 지원하고,
MS-SQL Server, Sybase계열은 두 가지를 모두 지원한다. 구조상으로 기본구조는
Heap 또는 Dense Index로 구성되어야 한다. 구조상 그렇다. 여기에서는 MS-SQL Server를
다루도록 하것다.

그렇다면 클러스터드 인덱스(Sparse Index)와 논클러스터드 인덱스(Dense Index)를 어떤
기준으로 선정해야 할까? 아마도 MS나 Sybase의 DBMS를 만지고 있는 사람이라면 이런 고민
한번쯤은 해봤을 것이다.

보통은 이렇다.

- 범위검색에 많이 사용된다면 클러스터드 인덱스를 사용
- 포인트쿼리(1건 검색)에 많이 사용되거나 몇 건 안되는 컬럼(들)에 논클러스터드 인덱스 사용

회원번호, 가입일..... 과 같은 테이블이라면 뭐 대충 날짜에 생성해 넣는다.
대충 맞기는 하다. 하지만 범위검색 조건으로 서로 다른 컬럼이 생성된다면 어떤 컬럼을
클러스터드 인덱스로 잡을 것인가? 애매모호하다. 대부분 이런 경우다.


주문일, 결제일, 배송완료일 중 어느 컬럼에 클러스터드 인덱스를 잡을 것인가??
주문테이블(주문번호, 회원번호, 주문일, 결제일, 배송완료일...)

물론 이전에 설계가 잘 되었는지 살펴보아야 한다. 많은 경우 설계상으로 해결할 수도 있다.
뭐.. 대충 다음과 같은 따위로 해결 할 수 있다. 바로 주문상태테이블의 상태변경일에
클러스터드 인덱스 잡으면 해결된다.

주문테이블(주문번호, 회원번호)
주문상태테이블(주문번호, 상태코드, 상태변경일) //상태코드: 1(주문), 2(결제), 3(배송완료)

뭐..이렇게 해결할 수도 있지만 어쨌든 통합을 하면 유연해지지만 데이터양이 늘어날 수도 있고,
개체집합의 개념의 범위가 늘어남에 따른 문제(개념의 범위가 조낸 넓으면 관리상의 문제와
데이터 품질에 문제가 생길 수 있다.)가 발생할 수도 있다.

어쨌든 주문일, 결제일, 배송완료일 중 어느 컬럼에 클러스터드 인덱스를 잡을 것인가??라는
문제는 여전히 애매모호하다. 애매모호한 이유가 뭘까? 2가지다.

- 클러스터드 인덱스는 테이블당 1개만 생성 가능하다.
- 범위검색 조건으로 여러 개의 컬럼이 독립적으로 자주 사용된다.

어쨌든 변하지 않는 사실은 클러스터드 인덱스는 테이블 1개만 생성 가능'이다. (딴지 걸지 말자.
MS-SQL Server 2005의 인덱스 생성구문에 Inclued를 이용하면 2개의 클러스터드 인덱스 처럼의
흉내는 가능하지만 조낸 갱신부하 있다.) 어쨌든 클러스터드 인덱스를 생성할 컬럼을 선정해야 하기는
한다. 그렇다면 어떤 기준으로??

바로, "질의적중률" 이다. 질의 적중률은 다음과 같이 계산된다. (초딩 산수다..)

질의적중률 = 검색Row수/전체Row수

or

질의적중률 = 논리IO수/전체IO --> 요거 추천...


위의 예를 들어 보면...


A. SUM(주문일로 검색되는 질의들의 질의적중률) 계산
B. SUM(결제일로 검색되는 질의들의 질의적중률) 계산
C. SUM(배송완료일로 검색되는 질의들의 질의적중률) 계산

IF      A > B AND A > C THEN A(주문일)에 클러스터드 인덱스 생성
ELSE IF B > A AND B > C THEN B(배송일)에 클러스터드 인덱스 생성
ELSE IF C > A AND C > B THEN C(배송완료일)에 클러스터드 인덱스 생성


끝이다. 조낸 간단하다. 결론은 질의적중률이 높은 컬럼(들)에 클러스터드 인덱스를 생성하면 유리하다.
요런게 왜 DBMS책에 안나오는 걸까?
 
0
    
 
0
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
34  인덱스를 위한 교재 추천 부탁 드립니다.   member 난모르겠 0 / 0 23405 2020-06-28
33  테이블 부하에 대해서...?   member 헨씀히포 0 / 0 23224 2019-05-24
32  MSSQL - 문자함수(len함수와 datalength 함수) 이미지   admin 웹마당넷 3 / 0 41081 2017-09-10
31  MSSQL - 백업 데이터를 다른 데이터베이스로 복원하기 이미지   admin 웹마당넷 6 / 2 29857 2015-07-05
30  MSSQL - SELECT 결과를 테이블로 만들기 이미지   admin 웹마당넷 1 / 0 27709 2015-06-26
29  기본 데이타 베이스 저장소 위치 바꾸기   member 아침마당 1 / 1 26434 2010-11-04
28  SQL Server 2008 복원시 트랜잭션 로그 백업   member 아침마당 1 / 0 26537 2010-09-25
27  SQL 인젝션 공격을 당했을 경우 인젝션 스크립트 지우는 저장 프로시저   member 아침마당 1 / 0 26077 2010-09-14
26  SQL Server 트랜잭션 로그 파일 줄이는 방법   member 아침마당 0 / 1 32450 2010-09-14
25  [MSSQL] SQL Server 2008 테이블 디자인 수정시 주의 사항   member 아침마당 1 / 0 28225 2010-08-22
24  [MSSQL] ISNULL 함수 간단 예제   member 아침마당 4 / 1 47998 2010-08-05
23  MSSQL - SELECT 와 동시에 INSERT 하기   admin 웹마당넷 14 / 3 153923 2009-02-03
22  MSSQL - IDENTITY 값 초기화 하기   admin 웹마당넷 3 / 2 63463 2009-01-27
21  MS-SQL 클러스터드 인덱스를 어떤 컬럼(들)에 생성하는 것이 유리할까?   member 마카로니 0 / 0 30015 2009-01-08
20  테이블 및 개체의 정보를 확인하기 위한 시스템 저장 프로시저(System Stored pr..   admin 웹마당넷 0 / 0 27632 2008-12-20
19  MSSQL 조인(JOIN)을 이용한 UPDATE 및 DELETE   admin 웹마당넷 5 / 0 53899 2008-11-29
18  SQL injection 웹에서 체크하기   member 수확물 0 / 0 26860 2008-10-10
17  MSSQL - CASE WHEN문   member 다자래 1 / 0 69969 2008-09-19
16  [MSSQL] 파티션 정보 검색   member 수확물 0 / 0 28703 2008-09-08
15  [MSSQL] DDL_Trigger_Example   member 수확물 0 / 0 34650 2008-09-08
14  [MSSQL] xml을 이용한 split   member 수확물 1 / 0 28823 2008-08-26
13  MSSQL - UNION ALL을 이용했을때 테이블명 가져오기 이미지   member 다자래 0 / 0 40225 2008-08-21
12  MSSQL - NULL 값을 다른 값으로 대체하기   member 다자래 8 / 4 101421 2008-08-21
11  [MSSQL] View안에 저장프로스져를 쓰는 방법   member 수확물 0 / 0 45393 2008-08-08
10  MSSQL - 숫자 세자리 마다 콤마(쉼표) 찍기   member 다자래 5 / 0 59247 2008-08-07
write
[2] button