codememo

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

tipmemo 2023. 4. 8. 08:32
반응형

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

clustered a. a. a.non-clustered index

클러스터된 인덱스

  • 테이블당 1개만
  • 데이터가 인덱스 순서로 물리적으로 저장되므로 클러스터되지 않은 데이터보다 읽기 속도 향상

비클러스터 인덱스

  • 테이블당 여러 번 사용 가능
  • 클러스터된 인덱스보다 삽입 및 업데이트 작업이 빠릅니다.

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

삽입 및 업데이트 속도가 느리기 때문에 클러스터된 인덱스는 보통 증분 Id 또는 Timestamp 필드에 설정해야 합니다.

SQL Server는 일반적으로 선택성이 95% 이상인 경우에만 인덱스를 사용합니다.

클러스터된 인덱스는 디스크의 데이터를 물리적으로 정렬합니다.즉, 인덱스에 추가 데이터가 필요하지 않지만 클러스터된 인덱스는 1개만 있을 수 있습니다(분명히).클러스터된 인덱스를 사용하여 데이터에 액세스하는 것이 가장 빠릅니다.

다른 모든 인덱스는 비클러스터되어야 합니다.비클러스터형 인덱스에는 실제 데이터 행(클러스터형 인덱스가 있는 경우 클러스터형 인덱스에 대한 포인터)에 대한 포인터와 함께 정렬된 인덱스 열의 데이터가 중복됩니다.즉, 비클러스터 인덱스를 통해 데이터에 액세스하는 경우 추가적인 간접 계층을 거쳐야 합니다.그러나 인덱스된 열에 사용 가능한 데이터만 선택하면 중복된 인덱스 데이터에서 직접 데이터를 가져올 수 있습니다(따라서 *를 사용하지 않고 필요한 열만 선택하는 것이 좋습니다).

클러스터된 인덱스는 테이블에 물리적으로 저장됩니다.즉, 테이블당 클러스터된 인덱스를 하나만 가질 수 있습니다.

비클러스터된 인덱스는 별도로 저장되며 원하는 개수의 인덱스를 가질 수 있습니다.

가장 좋은 옵션은 가장 많이 사용되는 고유 열(일반적으로 PK)에 클러스터된 인덱스를 설정하는 것입니다.테이블에는 항상 잘 선택된 클러스터형 인덱스가 있어야 합니다. 단, 특별한 이유가 있을 수 있습니다. 단, 그렇게 하지 않는 경우가 있습니다.

클러스터된 인덱스

  1. 테이블에는 클러스터된 인덱스를 하나만 사용할 수 있습니다.
  2. 보통 프라이머리 키로 작성됩니다.
  3. 클러스터된 인덱스의 리프 노드에는 데이터 페이지가 포함됩니다.

비클러스터형 인덱스

  1. 테이블에는 249개의 비클러스터 인덱스만 있을 수 있습니다(2005년 이후 버전의 SQL은 최대 999개의 비클러스터 인덱스를 지원합니다).
  2. 보통 임의의 키로 제작됩니다.
  3. 비클러스터 인덱스의 리프 노드가 데이터 페이지로 구성되어 있지 않습니다.대신 리프 노드에는 인덱스 행이 포함됩니다.

클러스터된 인덱스

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

비클러스터 인덱스

  • 테이블에는 클러스터되지 않은 인덱스가 얼마든지 있을 수 있습니다.
  • 물리적 순서에 영향을 주지 마십시오.데이터 행에 대한 논리적 순서를 생성하고 물리적 데이터 파일에 대한 포인터를 사용합니다.
  • 클러스터된 인덱스보다 데이터 삽입/업데이트 속도가 빠름
  • 논리 구조를 저장하기 위해 여분의 공간 사용

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

장점:

클러스터된 인덱스는 범위에 매우 적합합니다(예를 들어 my_table에서 *를 선택합니다.여기서 my_key는 @min과 @max 사이입니다).

경우에 따라서는 orderby 문을 사용하면 DBMS가 정렬 작업을 수행할 필요가 없습니다.

단점:

클러스터된 인덱스는 새 키가 순차적으로 정렬되지 않은 경우 레코드가 삽입될 때 레코드의 실제 레이아웃을 수정해야 하므로 삽입 속도가 느려질 수 있습니다.

클러스터는 기본적으로 데이터가 표의 물리적 순서로 나열되어 있음을 의미합니다.이것이 테이블당 1개만 가질 수 있는 이유입니다.

클러스터되지 않았다는 것은 논리적인 순서일 뿐이라는 것을 의미합니다.

클러스터 인덱스는 실제로 레코드가 디스크에 물리적으로 저장되는 순서를 나타내므로 레코드가 하나만 있는 이유를 나타냅니다.

비클러스터 인덱스는 Disk의 실제 순서와 일치하지 않는 논리 순서를 정의합니다.

인덱스 데이터베이스는 2개의 부분으로 구성되어 있습니다.물리 레코드 세트는 임의의 순서로 배열되어 있으며, 레코드가 어떤 기준에 의해 정렬된 결과를 얻기 위해 읽혀져야 하는 시퀀스를 식별하는 인덱스 세트입니다.물리적 배열과 인덱스 사이에 상관관계가 없는 경우, 모든 레코드를 순서대로 읽으려면 많은 독립적인 단일 레코드 읽기 작업을 수행해야 할 수 있습니다.데이터베이스는 연속되지 않은 두 개의 레코드를 읽는 것보다 짧은 시간에 수십 개의 연속된 레코드를 읽을 수 있기 때문에 인덱스에 연속된 레코드도 디스크에 연속적으로 저장하면 성능이 향상될 수 있습니다.인덱스가 클러스터화되도록 지정하면 데이터베이스는 인덱스에 연속된 레코드 그룹이 디스크에서 연속되도록 정렬하기 위해 약간의 노력(데이터베이스에 따라 차이가 있음)을 하게 됩니다.

예를 들어 빈 비클러스터 데이터베이스로 시작하여 10,000개의 레코드를 랜덤 순서로 추가하는 경우 레코드는 추가된 순서대로 마지막에 추가됩니다.인덱스로 데이터베이스를 순서대로 읽으려면 10,000개의 한 레코드 읽기가 필요합니다.단, 클러스터형 데이터베이스를 사용하는 경우 시스템은 각 레코드를 추가할 때 이전 레코드가 자체 저장되었는지 여부를 확인할 수 있습니다.이 경우 데이터베이스 끝에 새 레코드로 레코드를 작성할 수 있습니다.그런 다음 이동된 레코드가 존재하던 슬롯 앞의 물리 레코드를 보고 그 뒤에 나오는 레코드가 스스로 저장되었는지 여부를 확인할 수 있습니다.만약 그게 사실이라면, 그 기록을 그 장소로 옮길 수 있을 거야.이러한 접근 방식을 사용하면 많은 레코드가 쌍으로 그룹화되어 순차적 읽기 속도가 거의 두 배로 증가할 수 있습니다.

실제로 클러스터된 데이터베이스는 이보다 더 정교한 알고리즘을 사용합니다.단, 중요한 점은 데이터베이스 갱신에 필요한 시간과 순차적으로 읽는 데 필요한 시간 사이에 트레이드오프가 있다는 것입니다.클러스터된 데이터베이스를 유지 관리하면 정렬 시퀀스에 영향을 미치는 방식으로 레코드를 추가, 제거 또는 업데이트하는 데 필요한 작업량이 크게 증가합니다.데이터베이스가 업데이트되는 빈도보다 훨씬 더 자주 순차적으로 읽혀진다면 클러스터링은 큰 이점이 될 수 있습니다.자주 업데이트되지만 순차적으로 읽히는 경우가 거의 없는 경우, 특히 데이터베이스에 항목을 추가하는 순서가 클러스터된 인덱스에 대한 정렬 순서와 무관할 경우 클러스터링은 큰 성능 저하가 될 수 있습니다.

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

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

특히 자주 업데이트되는 테이블에서 클러스터된 인덱스를 유지하는 데 따른 오버헤드가 성능 저하로 이어질 수 있으므로 비클러스터된 인덱스를 생성하는 것이 더 나을 수 있습니다.

위의 글에서 이론적인 부분을 확인했을 수 있습니다.

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

- 비클러스터형 인덱스에서는 클러스터형 인덱스를 간접적으로 가리키고 실제 레코드에 액세스하지만, 간접적인 특성으로 인해 액세스에 다소 시간이 걸립니다.또한 인덱스를 저장하기 위해 자체 메모리/공간이 필요합니다.

여기에 이미지 설명 입력

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

클러스터화

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

비클러스터화

  • 비클러스터형 인덱스는 데이터 행과 다른 구조를 가집니다.키 값과 비클러스터형 인덱스 키 값이 됩니다.
    각 키 값 엔트리에는 키 값을 포함하는 데이터 행에 대한 포인터가 있습니다.
  • 비클러스터형 인덱스의 인덱스 행에서 데이터 행으로의 포인터를 행 로케이터라고 합니다.행 로케이터의 구조는 데이터 페이지가 힙 또는 클러스터된 테이블에 저장되는지 여부에 따라 달라집니다.힙의 경우 행 로케이터는 행에 대한 포인터입니다.클러스터된 테이블의 경우 행 로케이터는 클러스터된 인덱스 키입니다.

클러스터된 인덱스

  • 클러스터된 인덱스는 검색 속도가 빠르고 삽입 및 업데이트 속도가 느립니다.
  • 테이블은 클러스터된 인덱스를 하나만 가질 수 있습니다.
  • 논리 구조를 저장하기 위해 여분의 공간이 필요하지 않습니다.
  • 디스크에 데이터를 저장하는 순서를 결정합니다.

비클러스터된 인덱스

  • 비클러스터형 인덱스는 데이터 검색 속도가 느리고 삽입 및 업데이트 속도가 빠릅니다.

  • 테이블에는 클러스터되지 않은 인덱스가 여러 개 있을 수 있습니다.

  • 논리 구조를 저장하려면 추가 공간이 필요합니다.

  • 디스크에 데이터를 저장하는 순서에 영향을 주지 않습니다.

언급URL : https://stackoverflow.com/questions/91688/what-are-the-differences-between-a-clustered-and-a-non-clustered-index

반응형