DB/etc

DB 인덱스 INDEX

sshhhh 2023. 10. 5.

1. 클러스터형 인덱스 (Clustered Index)

  • 클러스터형 인덱스는 데이터베이스 테이블의 행들을 물리적으로 정렬하는 방법을 나타낸다.
  • 각 테이블당 하나의 클러스터형 인덱스만 가질 수 있다.
    주로 테이블의 기본 키(primary key) 컬럼에 클러스터형 인덱스를 생성하는 것이 일반적
  • 테이블의 데이터는 클러스터형 인덱스의 키 값에 따라 정렬되어 저장됩니다.
  • 테이블에 클러스터형 인덱스가 없는 경우에는 테이블의 데이터는 힙(Heap) 구조로 저장되며 물리적인 정렬이 없다.
--******클러스터형 인덱스를 사용한 경우******

-- 테이블 생성 및 클러스터형 인덱스 설정
CREATE TABLE #CLUSTER_EX (
    ID INT PRIMARY KEY CLUSTERED, --"ID" 열에 클러스터형 인덱스를 설정 --> 데이터를 삽입할 때 "ID" 열의 값에 따라 물리적으로 정렬
    NAME NVARCHAR(50)
)

-- 데이터 삽입
INSERT INTO #CLUSTER_EX (ID, NAME)
VALUES (3, 'ALICE'), (1, 'JOHN'), (2, 'BOB')

-- 쿼리 실행
SELECT * FROM #CLUSTER_EX

--******클러스터형 인덱스를 사용하지 않은 경우 (힙 구조):******

-- 테이블 생성 및 클러스터형 인덱스 미설정 --> 데이터는 삽입된 순서대로 저장
CREATE TABLE #NONCLUSTER_EX (
    ID INT PRIMARY KEY,
    NAME NVARCHAR(50)
)

-- 데이터 삽입
INSERT INTO #NONCLUSTER_EX (ID, NAME)
VALUES (3, 'ALICE'), (1, 'JOHN'), (2, 'BOB')

-- 쿼리 실행
SELECT * FROM #NONCLUSTER_EX

--DROP TABLE #NONCLUSTER_EX

 

사용 "ID" 열의 값에 따라 데이터가 물리적으로 정렬되어 저장되므로 특정 순서로 결과를 가져오는 작업이 빠름
사용X 데이터가 힙 구조로 저장되어 특정 순서로 결과를 가져오는 데 더 많은 시간이 소요

 

 

*클러스터형 인덱스를 사용한 경우와 사용하지 않은 경우의 실행 결과는 동일할 수 있다.
  그러나 정렬된 결과를 가져오는 등의 작업에서 성능 차이가 발생할 수 있다.

 

즉, 클러스터형 인덱스의 주요 이점은 정렬된 결과를 빠르게 가져올 수 있는 것!

공식문서

https://learn.microsoft.com/ko-kr/sql/relational-databases/indexes/heaps-tables-without-clustered-indexes?view=sql-server-ver16

 

 

 

2. 비클러스터형 인덱스 (Non-Clustered Index)

  • 비클러스터형 인덱스는 데이터베이스 테이블의 데이터 정렬과는 독립적으로 생성된다.
  • 하나의 테이블에 여러 개의 비클러스터형 인덱스를 생성할 수 있다.
  • 비클러스터형 인덱스는 테이블의 데이터 레코드를 실제로 정렬하지 않고 별도의 데이터 구조로 생성된다.
  • 비클러스터형 인덱스는 클러스터형 인덱스와 마찬가지로 검색, 정렬 및 필터링에 사용되며, 데이터를 효율적으로 찾을 수 있도록 도와준다.
  • 비클러스터형 인덱스는 테이블의 비-기본 키(non-primary key) 컬럼에 생성할 수 있다.

 

**primary key열에 대해서 클러스터형 인덱스(clustered index)가 생성되는 이유?

  • 기본키는 해당 테이블의 레코드(행)를 고유하게 식별하는 열이므로, 클러스터형 인덱스를 활용하여 레코드의 물리적인 저장 순서를 제어합니다.
  • 클러스터형 인덱스는 데이터베이스 테이블의 물리적인 구조를 변경하는 역할을 하며, 기본키 값에 따라 데이터가 저장되므로 기본키 열을 기반으로 효율적인 검색이 가능합니다. 이로 인해 기본키 열은 보통 클러스터형 인덱스로 설정됩니다.

 

 

+비클러스터형 인덱스(Non-Clustered Index)는 클러스터드 인덱스와 달리 테이블의 물리적 순서를 변경하지 않는 인덱스 유형입니다.

 

<비클러스터형 인덱스를 사용하는 이유>

  1. 추가적인 인덱스 필요
    클러스터드 인덱스가 이미 설정되어 있을 때, 특정 열 또는 조건에 대한 추가적인 인덱스가 필요할 수 있습니다.
    이때 비클러스터형 인덱스를 사용하여 해당 열 또는 조건에 대한 검색 성능을 향상시킬 수 있습니다.
  2. 복수 열 검색 및 정렬
    비클러스터형 인덱스는 여러 열을 포함하거나 다양한 조건으로 검색 및 정렬할 수 있습니다.
    클러스터드 인덱스는 주로 테이블의 물리적 순서를 기반으로 하므로,
    다양한 열 및 조건에 대한 검색 성능을 최적화하는 데는 한계가 있을 수 있습니다.
  3. 데이터의 물리적 순서 변경 없이 정렬
    클러스터드 인덱스를 변경하려면 테이블의 물리적 순서를 변경해야 합니다.
    하지만 비클러스터형 인덱스는 테이블의 물리적 순서를 변경하지 않으며,
    필요한 열 또는 조건에 대한 인덱싱을 수행합니다.
  4. 복합 인덱스 구성
    비클러스터형 인덱스는 여러 열을 조합하여 복합 인덱스를 구성할 수 있습니다.
    이를 통해 여러 열에 대한 다중 조건 검색을 효과적으로 수행할 수 있습니다.
  5. 데이터 변경 시 미치는 영향 최소화
    클러스터드 인덱스를 변경하면 해당 테이블의 물리적 순서도 변경됩니다.
    이로 인해 데이터의 이동이 발생하고, 이는 성능 저하 및 잠금 상태를 유발할 수 있습니다.
    반면 비클러스터형 인덱스는 테이블의 물리적 순서를 변경하지 않으므로 데이터 변경 작업에 미치는 영향을 최소화합니다.
  6. 클러스터드 인덱스 변경 제한
    클러스터드 인덱스는 테이블당 하나만 설정할 수 있고 변경하기 어렵습니다.
    반면 비클러스터형 인덱스는 여러 개를 설정할 수 있으며 변경하기 쉽습니다.

따라서 데이터베이스 설계 및 쿼리의 성능 요구 사항에 따라 비클러스터형 인덱스를 사용하여 데이터 액세스와 검색 성능을 최적화할 수 있습니다.

 

 

 

***읽어볼것

https://sagittariusof85s.tistory.com/115

 

[MS-SQL]인덱스에 대한 정리

이번에는 인덱스에 대해 정리를 해보고자 합니다.INDEX는 여러 DB에서모두 사용되는 개념??기능??그런 것입니다. SQL SERVER 뿐 아니라ORACLE, MY SQL등에서도모두 사용을 하는 개념입니다. DB를 최적화

sagittariusof85s.tistory.com

 

'DB > etc' 카테고리의 다른 글

MSSQL OPTION(RECOMPILE)  (1) 2023.10.05
매핑 테이블(mapping table)  (1) 2023.10.05
DB 트랜잭션  (0) 2023.10.05
ORACLE, MYSQL ERD 생성  (0) 2023.09.13
DB - 엔티티, 테이블의 차이  (0) 2023.09.12

댓글