인덱스란??

 인덱스는 테이블이나 뷰와 관련된 디스크 또는 메모리 내 구조로 검색 속도를 향상하기 위해서 사용합니다.

 인덱스는 대상의 하나의 이상의 열로 구성되며 일반적으로 키값이 효율적인 검색이 가능한 구조인

 B-트리(Balanced Tree)로  저장됩니다.

 만약에 c++ 프로그래밍을 한다면 std::set이나 std::map 컨테이너의 구조에서 key로 사용되는 구조를 인덱스와

 비슷하다고 생각하면 조금 더 쉽게 이해 할 수 있습니다. 

인덱스의 종류

 클러스터 인덱스(Clustered Index)

  cluster란 영어의 뜻을 번역해보면 "송이를 이루다", "떼를 이루게 하다"입니다.

  이와 같이 클러스터 인덱스를 구성하면 테이블의 데이터들이 인덱스를 구성하는 키를 기준으로 정렬이 되게 됩니다. 

  현실세계에서 클러스터 인덱스와 가장 비슷하게 비유될 수 있는 구조는 우리가 자주 사용하는 영어 사전을 보면

  쉽게 이해 될 수 있습니다. 영어 사전에서 "Index" 라는 단어를 어떻게 검색 하는지 도식화 해보겠습니다. 

클러스터인덱스 => 영어사전

  위와같은 방식으로 사전을 검색할 수 있는 이유는 데이터가 검색 기준에 의해서 정렬되어 있기 때문에 가능한

  구조입니다.

  데이터가 정렬되어야 한다는 조건 때문에 클러스터 인덱스는 테이블에 하나밖에 생성될 수 없습니다. 

  만약에 클러스터 인덱스가 여러 개 생성된다면 해당 열에 의해서 정렬된 원본 데이터들의 복사본이 생겨야

  하기 때문에 정상적인 데이터 베이스 구조가 될 수 없기 때문입니다. 

  만약에 여러개의 인덱스가 필요하다면 어떻게 해야 할까요? 이럴 때는 비클러스터 인덱스를 사용합니다.

 비클러스터 인덱스(NonClustered)

  비클러스터 인덱스를 구성하면 원본 데이터에는 영향을 미치지 않는 key/Value 타입의 구조를 생성합니다. 

  key는 인덱스를 구성한 테이블의 열들로 구성되며 값은 원본 데이터의 포인터로 구성됩니다.

  (클러스터와 비클러스터가 혼합된 테이블에서는 값은 클러스터 인덱스의 열의 값 가집니다.)

  현실세계에서 비클러스터 인덱스와 비슷한 구조를 찾아본다면 "찾아보기"라는 페이지가 있는 책과 비슷합니다. 

논클러스터인덱스 => 찾아보기

  위와 같은 방식은 검색하는 단어로 책이 정렬되어 있지 않지만 검색이 가능합니다. 

  검색이 가능한 이유는 찾아보기에서 검색 단어가 포함된 페이지번호를 지칭하고 있기 때문입니다.

  이방식으로 검색하게 되면 데이터가 검색 키 순으로 정렬되어 있지 않아도 빠르게 접근 가능 합니다. 

 유니크 인덱스(Unique) / 비유니크 인덱스(NonUnique)

  유니크 인덱스는 인덱스의 키값이 중복되지 않은 인덱스를 말합니다. 

  반대로 비유니크 인덱스는 키값의 중복을 허용합니다. 

  c++에서 std::map과 std::multimap과의 차이와 같습니다. 

인덱스의 실제 내부 동작 방식

  SQL서버 내부에서 인덱스가 실제로 어떻게 동작하는지 알고 싶으시면 아래 링크를 클릭하세요

  링크

 

[MSSQL] 인덱스의 내부 동작 방식

이전 인덱스의 설명에서 인덱스는 B-트리로 구성된다고 설명 드렸습니다. 트리는 각 페이지를 노드로 구성되어 있습니다. 루트(뿌리) 노드는 최상위 노드이고 리프(잎) 노드는 최하위 노드들을 말합니다. 클러스터..

jungwoong.tistory.com

인덱스 생성 방법

 msdn의 인덱스 생성 방법 링크

 

CREATE INDEX(Transact-SQL) - SQL Server

CREATE INDEX(Transact-SQL)CREATE INDEX (Transact-SQL) 이 문서의 내용 --> 적용 대상: SQL Server Azure SQL Database Azure SQL Data Warehouse 병렬 데이터 웨어하우스 APPLIES TO: SQL Server Azure SQL Database Azure SQL Data Warehouse Parallel Data Warehouse 테이블 또는 뷰에 관계 인덱스를 만듭니다.

docs.microsoft.com

간단한 인덱스 생성 예제를 작성해봅니다. 

// xxxTable에 비클러스터 인덱스를 Str열을 기준으로 idx_xxxTable라는 
// 이름으로 생성해라
CREATE INDEX idx_xxxTable
ON xxxTable (Str)

// xxxTable에 유니크한 비클러스터 인덱스를 Name열을 기준으로 idx_xxxTableUnique라는 
// 이름으로 생성해라
CREATE UNIQUE INDEX idx_xxxTableUnique
ON xxxTable (Name)

제약 조건으로 자동 인덱스 생성

 Primary Key

  인덱스에서 Primary Key를 생성한다면 자동으로 해당하는 열에 클러스터 형 인덱스가 생성됩니다. 

  물론 Primary key도 테이블당 하나만 생성 가능하고 클러스터형 인덱스 또한 테이블당 하나만 생성 가능합니다. 

CREATE TABLE xxxTable
{
	UserSN	int NOT NULL PRIMARY KEY,
    .....
}

  만약에 Primary Key를 강제로 비클러터형 인덱스로 생성할 수 도 있습니다.

CREATE TABLE xxxTable
{
	UserSN	int NOT NULL PRIMARY KEY NONCLUSTERED,
    .....
}

Unique 제약조건

 테이블 열에 Unique라는 제약조건을 추가하면 자동으로 비클러스터형이며 Unique한 인덱스가 생성됩니다. 

CREATE TABLE xxxTable
{
	UserID	int NOT NULL UNIQUE,
    .....
}


// 또한 유니크 제약조건도 명시적으로 CLUSTERED 형으로 지정할 수 있습니다
CREATE TABLE xxxTable
{
	UserID	int NOT NULL UNIQUE CLUSTERED
    .....
}

'MSSQL' 카테고리의 다른 글

[설치] SQL Server 2019 Developer 설치하기  (0) 2022.08.26
[MSSQL] 트랜잭션(Transaction)  (0) 2020.01.07
[MSSQL] 인덱스의 내부 동작 방식  (0) 2019.11.16
SQL Server의 데이터 관리  (0) 2019.11.04

+ Recent posts