문제

a의 차이점은 무엇인가요? clustered 그리고 non-clustered index?

도움이 되었습니까?

해결책

클러스터형 인덱스

  • 테이블당 1개만 가능
  • 데이터가 인덱스 순서로 물리적으로 저장되므로 비클러스터형보다 읽기가 더 빠릅니다.

비클러스터형 인덱스

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

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

삽입 및 업데이트 속도가 느리기 때문에 클러스터형 인덱스는 일반적으로 증분 필드(예: ID 또는 타임스탬프)에 설정되어야 합니다.

SQL Server는 일반적으로 선택도가 95%를 초과하는 경우에만 인덱스를 사용합니다.

다른 팁

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

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

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

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

가장 좋은 옵션은 가장 많이 사용되는 고유 열(일반적으로 PK)에 클러스터형 인덱스를 설정하는 것입니다.매우 설득력 있는 이유(단 하나도 생각할 수 없지만, 밖에 있을 수도 있음)가 아니라면 테이블에는 항상 잘 선택된 클러스터형 인덱스가 있어야 합니다.

클러스터형 인덱스

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

비클러스터형 인덱스

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

클러스터형 인덱스

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

비클러스터형 인덱스

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

이러한 차이점 외에도 테이블이 비클러스터형(테이블에 클러스터형 인덱스가 없는 경우)일 때 데이터 파일은 순서가 지정되지 않고 힙 데이터 구조를 데이터 구조로 사용한다는 점을 알아야 합니다.

클러스터링이란 기본적으로 데이터가 테이블의 물리적 순서에 있음을 의미합니다.그렇기 때문에 테이블당 하나만 가질 수 있습니다.

클러스터되지 않았다는 것은 논리적 순서가 "단지"라는 의미입니다.

장점:

클러스터형 인덱스는 범위에 적합합니다(예:@min과 @max 사이의 my_key가 있는 my_table에서 *를 선택하세요.

일부 조건에서는 orderby 문을 사용하면 DBMS가 정렬 작업을 수행할 필요가 없습니다.

단점:

클러스터형 인덱스는 새 키가 순차적 순서가 아닌 경우 레코드를 넣을 때 레코드의 물리적 레이아웃을 수정해야 하기 때문에 삽입 속도가 느려질 수 있습니다.

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

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

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

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

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

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

예를 들어, 비어 있는 비클러스터형 데이터베이스로 시작하여 10,000개의 레코드를 무작위 순서로 추가하는 경우 레코드는 추가된 순서대로 마지막에 추가될 가능성이 높습니다.인덱스 순서대로 데이터베이스를 읽으려면 10,000회의 단일 레코드 읽기가 필요합니다.그러나 클러스터된 데이터베이스를 사용하는 경우 시스템은 각 레코드를 추가할 때 이전 레코드가 자체적으로 저장되었는지 여부를 확인할 수 있습니다.그러한 경우가 발견되면 데이터베이스 끝에 새 레코드와 함께 해당 레코드를 쓸 수 있습니다.그런 다음 이동된 레코드가 상주했던 슬롯 앞의 실제 레코드를 보고 그 뒤의 레코드가 자체적으로 저장되었는지 확인할 수 있습니다.그러한 경우가 발견되면 해당 기록을 해당 지점으로 이동할 수 있습니다.이러한 종류의 접근 방식을 사용하면 많은 레코드가 쌍으로 그룹화되어 순차 읽기 속도가 거의 두 배로 빨라질 수 있습니다.

실제로 클러스터형 데이터베이스는 이보다 더 정교한 알고리즘을 사용합니다.그러나 주목해야 할 핵심 사항은 데이터베이스를 업데이트하는 데 필요한 시간과 순차적으로 읽는 데 필요한 시간 사이에 상충 관계가 있다는 것입니다.클러스터된 데이터베이스를 유지 관리하면 정렬 순서에 영향을 미칠 수 있는 방식으로 레코드를 추가, 제거 또는 업데이트하는 데 필요한 작업량이 크게 늘어납니다.데이터베이스가 업데이트되는 것보다 훨씬 더 자주 순차적으로 읽히는 경우 클러스터링이 큰 이점이 될 수 있습니다.자주 업데이트되지만 순서대로 읽는 경우가 거의 없다면 클러스터링은 성능을 크게 저하시킬 수 있습니다. 특히 항목이 데이터베이스에 추가되는 순서가 클러스터형 인덱스에 대한 정렬 순서와 무관한 경우에는 더욱 그렇습니다.

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

클러스터링됨

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

비클러스터형

  • 비클러스터형 인덱스는 데이터 행과 별도의 구조를 갖습니다.비 클러스터 된 인덱스에는 비 클러스터 인덱스 키 값이 포함되어 있으며
    각 키 값 항목에는 키 값이 포함 된 데이터 행에 대한 포인터가 있습니다.
  • 클러스터되지 않은 인덱스의 인덱스 행에서 데이터 행으로의 포인터를 행 로케이터라고합니다.행 로케이터의 구조는 데이터 페이지가 힙 또는 클러스터 된 테이블에 저장되어 있는지 여부에 따라 다릅니다.힙의 경우 행 로케이터는 행에 대한 포인터입니다.클러스터 된 테이블의 경우 행 로케이터는 클러스터 된 인덱스 키입니다.

위 게시물에서 이론 부분을 살펴보셨을 수도 있습니다.

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

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

enter image description here

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top