테이블을 생성할 때 제목에 언급한 4가지 설정이 헷갈리게 되는 경우가많다.
Key 와 Index로 나누어 생각하면 된다.
index는 물리적인 관점의 데이터 저장에 대한 설정이고
key 는 논리적인 관점의 데이터 저장에 대한 설정이다. (foreign key도 마찬가지)
데이터가 입력될 때 생성되는 index를 위주로 data를 정렬할 것인가 아니면 그냥 data정렬은 하지 않고 index만 추가할 것인가가 바로 Clustered Index와 NonClustered Index의 차이이다.
Primary Key는 논리적으로 데이터를 고유하게 식별할 수 있도록 제약조건을 걸어두는 것이다.
Primary Key의 제약조건은 다음과 같다.
- Not Null
- 중복된 값은 허용하지 않음
- 하나의 table에는 한개의 Primary Key를 허용
Unique Key의 제약조건은 다음과 같다.
- Null 값도 입력가능 (단 1개만 가능)
- 중복된 값은 허용하지 않음
- 하나의 table에 여러개의 unique key를 허용
사람을 헷갈리게 만드는 주 요인은 바로 Primary Key의 Default 설정이 Clustered Index라는 부분에 있다.
테이블을 만들고 Primary Key를 설정한 후 시스템 테이블 생성 쿼리로 해당 테이블을 확인해보면 다음과 같은 설정으로 잡혀있는 것을 확인할 수 있다.
01.
CREATE
TABLE
[dbo].[test2](
02.
[intCol] [
int
] IDENTITY(1,1)
NOT
NULL
,
03.
[varcharCol] [
varchar
](4)
NULL
,
04.
[nvarcharCol] [nvarchar](4)
NULL
,
05.
[textCol] [text]
NULL
,
06.
[datetimeCol] [datetime]
NULL
,
07.
PRIMARY
KEY
CLUSTERED
08.
(
09.
[intCol]
ASC
10.
)
WITH
(PAD_INDEX =
OFF
, STATISTICS_NORECOMPUTE =
OFF
, IGNORE_DUP_KEY =
OFF
, ALLOW_ROW_LOCKS =
ON
, ALLOW_PAGE_LOCKS =
ON
)
ON
[
PRIMARY
]
11.
)
ON
[
PRIMARY
] TEXTIMAGE_ON [
PRIMARY
]
위의 내용을 보면 Primary Key를 잡은 테이블에 대해 Clustered 옵션을 통해 Clustered Index를 자동 적용하였다.
반드시 Primary Key에 index설정을 포함해야 한다는 제약사항은 없다.
하지만 보통은 두가지가 동시 적용이 되는게 일반적이긴 하다.
Index에 대해서는 데이터의 중복 제약조건은 없다.
- 중복된 값이 있어도 상관없다. (여러개의 중복값이 존재하면 입력된 순서대로 index에 기록이 된다.)
테이블을 디자인 할 때, 다음 두 사항를 구분하여 염두에 두고 디자인을 하면 된다.
- 물리적인 테이블 구조에 대해 생각할 때에는 검색제한자가 되는 컬럼을 index 대상으로 삼고, 컬럼의 밀집도와 컬럼의 변경이 잦은정도에 대해 고려하여 index를 선언한다.
- 논리적인 테이블 구조에 대해 생각할 때에는 Primary Key보다는 Unique Key 요소가 없는지 생각하여 적용하고 그 중 기준이 되는 Key를 Primary Key로 선언한다.
'SQL' 카테고리의 다른 글
[MSSQL] 사용자정의 정렬(Order by)에 또다른 방법 (0) | 2012.09.12 |
---|---|
[MSSQL][구문] 테이블 형식 남기고 데이터만 삭제. (0) | 2012.09.05 |
[MSSQL] DB 목록, Table 목록, 그리고 Table 상세 정보 얻기, Create,Update 시간 알기 (0) | 2012.08.31 |
[MSSQL] 인덱스 통계보기 (0) | 2012.08.30 |
[MSSQL] sa계정 비밀번호 변경 (0) | 2012.08.16 |