클러스터형 인덱스와 비 클러스터형 인덱스의 차이점은 무엇입니까?


277

a clustered와 a 의 차이점은 무엇입니까 non-clustered index?


8
테이블 당 하나의 클러스터형 인덱스 만 가질 수 있습니다. 그러나 다른 많은 차이점이 있습니다 ...
Tom Robinson

5
클러스터형 인덱스는 실제로 레코드가 디스크에 실제로 저장되는 순서를 설명하므로 하나만 가질 수 있습니다. 비 클러스터형 인덱스는 디스크의 물리적 순서와 일치하지 않는 논리적 순서를 정의합니다.
Josh

1
클러스터링은 기본적으로 데이터가 테이블에서 해당 순서대로되어 있음을 의미합니다. 이것이 테이블 당 하나만 가질 수있는 이유입니다. 클러스터되지 않은 것은 논리적 순서가 "단지"임을 의미합니다.
Biri

2
@biri "논리"순서는 무엇입니까? 비 클러스터형 인덱스는 인덱스 키를 물리적으로 순서대로 저장하고 테이블에 대한 포인터, 즉 클러스터형 인덱스 키를 저장합니다.
Stephanie 페이지

@Stephanie Page : 테이블 관점에서 논리적입니다. 물론 비 클러스터형 인덱스는 인덱스 자체에서 물리적으로 정렬됩니다.
Biri

답변:


268

클러스터형 인덱스

  • 테이블 당 하나만
  • 데이터가 물리적으로 인덱스 순서로 저장되므로 클러스터되지 않은 것보다 빠르게 읽습니다.

비 클러스터형 인덱스

  • 테이블 당 여러 번 사용할 수 있습니다
  • 클러스터형 인덱스보다 빠른 삽입 및 업데이트 작업

인덱스를 사용하는 필드가있는 데이터를 선택할 때 두 가지 인덱스 유형 모두 성능이 향상되지만 업데이트 및 삽입 작업 속도가 느려집니다.

삽입 및 업데이트 속도가 느리기 때문에 일반적으로 Id 또는 Timestamp와 같이 증분 필드에 클러스터형 인덱스를 설정해야합니다.

SQL Server는 선택성이 95 %를 초과하는 경우에만 인덱스를 사용합니다.


9
스토리지 고려 사항도 있습니다. 클러스터형 인덱스가없는 테이블에 행을 삽입하면 행이 페이지에서 다시 연속으로 저장되고 행을 업데이트하면 행이 테이블의 끝으로 이동하여 빈 공간이 남고 테이블과 인덱스가 조각화 될 수 있습니다.
Jeremiah Peschka

4
x가 무엇인지 신경 쓰지 않아도됩니다. 알아야 할 것은 수백만 명의 사용자가있는 앱의 경우 x가 중요
하다는

14
순전히 교리입니다. "데이터가 순서대로 저장되므로 읽기 속도가 빠르지 않습니다". 인덱스 읽기를 피하고 테이블 읽기를 피하기 때문에 읽기 속도가 더 빠릅니다. 데이터가 순서대로 저장되므로 범위 스캔이 더 빠릅니다 (의미있는 경우). 즉 클러스터링 팩터가 완벽합니다.
Stephanie 페이지

6
또한 레코드의 95 %가 고유해야한다는 생각은 잘못된 것입니다. 1,000,000 개의 행이있는 테이블이 있고 500,000 개의 키로 열을 인덱싱한다고 가정합니다. 0 %는 고유하지만 각 키는 백만 행 중 2 개를 반환합니다. 이 인덱스는 레코드의 0 %가 고유하지 않더라도 절대적으로 유용합니다.
Stephanie 페이지

2
"데이터는 물리적으로 인덱스 순서로 저장됩니다"그게 무슨 뜻입니까? 한 수준에서는 데이터 페이지와 인덱스 리프 페이지가 동일하고 동일하기 때문에 사소한 사실입니다. 따라서 하나의 순서는 다른 쪽의 순서를 나타냅니다. 그러나 이것은 인덱스 키의 순서와 같은 특정 순서는 아닙니다. stackoverflow.com/questions/1251636/…
Martin Smith

79

클러스터형 인덱스는 디스크의 데이터를 물리적으로 정렬합니다. 이는 인덱스에 추가 데이터가 필요하지 않지만 클러스터 된 인덱스는 하나만있을 수 있음을 의미합니다. 클러스터형 인덱스를 사용하여 데이터에 액세스하는 것이 가장 빠릅니다.

다른 모든 인덱스는 클러스터되지 않아야합니다. 비 클러스터형 인덱스에는 인덱스 된 열의 데이터 복제본이 실제 데이터 행에 대한 포인터와 함께 순서대로 유지됩니다 (클러스터형 인덱스가있는 경우 이에 대한 포인터). 즉, 비 클러스터형 인덱스를 통해 데이터에 액세스하려면 추가 간접 계층이 필요합니다. 그러나 인덱싱 된 열에서 사용할 수있는 데이터 만 선택하면 복제 된 인덱스 데이터에서 직접 데이터를 다시 가져올 수 있습니다 (따라서 * 필요하지 않은 열만 선택하는 것이 좋습니다).


3
'하지만 인덱스 된 열에서 사용할 수있는 데이터 만 선택하면 복제 된 인덱스 데이터에서 직접 데이터를 다시 가져올 수 있습니다.'그렇습니다. 이는 클러스터 된 인덱스 휴리스틱 스의 중요한 예외입니다. 이 경우 본질적으로 클러스터 된 인덱스가 있지만 쿼리하는 테이블의 데이터가 적어 디스크에서 더 빨리 읽을 수 있습니다.
satnhak

34

클러스터형 인덱스는 실제로 테이블에 저장됩니다. 이는 가장 빠르며 테이블 당 하나의 클러스터형 인덱스 만 가질 수 있음을 의미합니다.

비 클러스터형 인덱스는 별도로 저장되며 원하는만큼 가질 수 있습니다.

가장 좋은 옵션은 가장 많이 사용되는 고유 열 (일반적으로 PK)에 클러스터형 인덱스를 설정하는 것입니다. 매우 강력한 이유는 하나의 생각할 수는 없지만, 그렇지 않을 수도 있습니다. 그렇지 않은 경우에는 그렇지 않을 수도 있습니다.


3
"항상 테이블에 클러스터형 인덱스가 있어야합니다"에 대해 더 자세히 설명 할 수 있습니까? 정교함없이 그 말은 항상
Pacerier

1
당신은 맞습니다 Pacerier, 절대 진술을 가볍게 사용해서는 안됩니다. 잘 선택된 클러스터형 인덱스가 없어야하는 단일 사례를 모르지만 그러한 경우가있을 수 있으므로 답변을보다 일반적인 버전으로 변경했습니다.
Santiago Cepas

28

클러스터형 인덱스

  1. 테이블에 대해 하나의 클러스터형 인덱스 만있을 수 있습니다.
  2. 일반적으로 기본 키에서 만들어집니다.
  3. 클러스터형 인덱스의 리프 노드에는 데이터 페이지가 포함됩니다.

비 클러스터형 인덱스

  1. 테이블에는 249 개의 비 클러스터형 인덱스 만있을 수 있습니다 (SQL 버전 2005 이후 버전은 최대 999 개의 비 클러스터형 인덱스를 지원할 때까지).
  2. 일반적으로 모든 키로 만들어집니다.
  3. 비 클러스터형 인덱스의 리프 노드는 데이터 페이지로 구성되지 않습니다. 대신 리프 노드에는 인덱스 행이 포함됩니다.

24

클러스터형 인덱스

  • 테이블에는 하나의 클러스터형 인덱스 만있을 수 있습니다.
  • 레코드를 정렬하고 순서에 따라 물리적으로 저장
  • 비 클러스터형 인덱스보다 데이터 검색 속도가 빠릅니다.
  • 논리적 구조를 저장하기 위해 추가 공간이 필요하지 않습니다

비 클러스터형 인덱스

  • 테이블에 여러 개의 비 클러스터형 인덱스가있을 수 있습니다.
  • 물리적 순서에는 영향을 미치지 않습니다. 데이터 행의 논리적 순서를 만들고 물리적 데이터 파일에 대한 포인터 사용
  • 데이터 삽입 / 업데이트가 클러스터형 인덱스보다 빠릅니다.
  • 논리적 구조를 저장하기 위해 추가 공간 사용

이러한 차이점을 제외하고는 테이블이 클러스터되지 않은 경우 (테이블에 클러스터 된 인덱스가없는 경우) 데이터 파일이 정렬되지 않고 데이터 구조로 힙 데이터 구조를 사용합니다.


10

클러스터링은 기본적으로 데이터가 테이블에서 실제 순서대로 있음을 의미합니다. 이것이 테이블 당 하나만 가질 수있는 이유입니다.

클러스터되지 않은 것은 논리적 순서가 "단지"임을 의미합니다.


9

장점 :

클러스터형 인덱스는 범위에 적합합니다 (예 : select * from my_table 여기서 my_key는 @min과 @max 사이).

경우에 따라 orderby 문을 사용하면 DBMS가 정렬 작업을 수행하지 않아도됩니다.

단점 :

새 키가 순차적 인 순서가 아닌 경우 레코드를 넣을 때 레코드의 실제 레이아웃을 수정해야하므로 클러스터 된 인덱스를 사용하면 삽입 속도가 느려질 수 있습니다.


6

클러스터형 인덱스는 기본적으로 인덱스 된 열에있는 데이터의 정렬 된 복사본입니다.

클러스터형 인덱스의 주요 장점은 쿼리 (검색)가 인덱스에서 데이터를 찾을 때 해당 데이터를 검색하는 데 추가 IO가 필요하지 않다는 것입니다.

특히 자주 업데이트되는 테이블에서 클러스터형 인덱스를 유지 관리하는 오버 헤드로 인해 성능이 저하 될 수 있으므로 비 클러스터형 인덱스를 만드는 것이 좋습니다.


6

인덱싱 된 데이터베이스에는 임의의 순서로 배열 된 실제 레코드 세트와 일부 기준으로 정렬 된 결과를 산출하기 위해 레코드를 읽어야하는 순서를 식별하는 인덱스 세트의 두 부분이 있습니다. 물리적 배열과 인덱스간에 상관 관계가없는 경우 모든 레코드를 순서대로 읽으려면 많은 독립적 인 단일 레코드 읽기 작업이 필요할 수 있습니다. 데이터베이스가 두 개의 비 연속 레코드를 읽는 데 걸리는 시간보다 적은 시간에 수십 개의 연속 레코드를 읽을 수 있으므로 인덱스에서 연속 된 레코드도 디스크에 연속적으로 저장되는 경우 성능이 향상 될 수 있습니다.

예를 들어 빈 클러스터되지 않은 데이터베이스로 시작하여 10,000 개의 레코드를 임의 순서로 추가하는 경우 레코드가 추가 된 순서대로 끝에 추가 될 수 있습니다. 인덱스 순서대로 데이터베이스를 읽으려면 10,000 개의 1 레코드 읽기가 필요합니다. 그러나 클러스터 된 데이터베이스를 사용하는 경우 시스템은 각 레코드를 추가 할 때 이전 레코드가 저절로 저 장되었는지 여부를 확인할 수 있습니다. 해당되는 경우 데이터베이스 끝에 새 레코드를 사용하여 해당 레코드를 쓸 수 있습니다. 그런 다음 이동 된 레코드가 상주했던 슬롯 이전의 실제 레코드를보고 그 뒤의 레코드가 저절로 저장되었는지 확인할 수 있습니다. 그것이 사실이라면, 그 기록을 그 자리로 옮길 수 있습니다. 이러한 접근 방식을 사용하면 많은 레코드가 쌍으로 함께 그룹화됩니다.

실제로 클러스터 된 데이터베이스는 이보다 더 정교한 알고리즘을 사용합니다. 그러나 데이터베이스를 업데이트하는 데 걸리는 시간과 순차적으로 읽는 데 걸리는 시간 사이에는 트레이드 오프가 있습니다. 클러스터 된 데이터베이스를 유지 관리하면 정렬 순서에 영향을 줄 수있는 방식으로 레코드를 추가, 제거 또는 업데이트하는 데 필요한 작업량이 크게 증가합니다. 데이터베이스가 업데이트되는 것보다 훨씬 자주 순차적으로 읽 히면 클러스터링이 큰 승리가 될 수 있습니다. 자주 업데이트되지만 순서대로 읽기가 거의 불가능한 경우, 특히 데이터베이스에 항목을 추가하는 순서가 클러스터 된 인덱스와 관련하여 정렬 순서와 무관 한 경우 클러스터링이 성능을 크게 저하시킬 수 있습니다.


5

클러스터형 인덱스는 실제로 레코드가 디스크에 실제로 저장되는 순서를 나타내므로 하나만 가질 수 있습니다.

비 클러스터형 인덱스는 디스크의 물리적 순서와 일치하지 않는 논리적 순서를 정의합니다.


2

위의 게시물에서 이론 부분을 살펴 보았을 것입니다.

-클러스터형 인덱스는 포인트를 직접 기록 할 수 있으므로 직접 검색 할 수 있으므로 검색 시간이 단축됩니다. 또한 인덱스를 저장하는 데 추가 메모리 / 공간이 필요하지 않습니다.

비 클러스터형 인덱스에서는 클러스터 된 인덱스를 간접적으로 가리킨 다음 실제 레코드에 액세스합니다. 간접적 인 특성으로 인해 액세스하는 데 시간이 좀 더 걸릴 수 있습니다. 인덱스

여기에 이미지 설명을 입력하십시오


0

// 비 클러스터형 인덱스의 두 번째 포인트는 MSDN에서 복사 한 것으로 다른 답변에서는 명확하게 언급되지 않았습니다.

클러스터

  • 클러스터형 인덱스는 키 값을 기준으로 테이블 또는 뷰에서 데이터 행을 정렬하고 저장합니다. 이들은 색인 정의에 포함 된 열입니다. 데이터 행 자체는 한 순서로만 저장할 수 있으므로 테이블 당 하나의 클러스터형 인덱스 만있을 수 있습니다.
  • 테이블의 데이터 행이 정렬 된 순서로 저장되는 유일한 시간은 테이블에 클러스터형 인덱스가 포함 된 경우입니다. 테이블에 클러스터 된 인덱스가 있으면 테이블을 클러스터 된 테이블이라고합니다. 테이블에 클러스터형 인덱스가없는 경우 해당 데이터 행은 힙이라고하는 정렬되지 않은 구조에 저장됩니다.

비 클러스터

  • 비 클러스터형 인덱스는 데이터 행과 별개의 구조를 갖습니다. 비 클러스터형 인덱스에는 비 클러스터형 인덱스 키 값과
    각 키 값 항목에는 키 값이 포함 된 데이터 행에 대한 포인터가 있습니다.
  • 비 클러스터형 인덱스의 인덱스 행에서 데이터 행으로의 포인터를 행 로케이터라고합니다. 행 로케이터의 구조는 데이터 페이지가 힙 또는 클러스터 된 테이블에 저장되는지 여부에 따라 다릅니다. 힙의 경우 행 로케이터는 행에 대한 포인터입니다. 클러스터 된 테이블의 경우 행 로케이터는 클러스터 된 인덱스 키입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.