기본 키와 클러스터형 인덱스의 관계


92

TABLE클러스터형 인덱스없이 기본 키를 가질 수 있습니까 ?

그리고 TABLE기본 키없이 클러스터형 인덱스를 가질 수 있습니까?

누구든지 기본 키와 클러스터형 인덱스 사이의 관계를 간단히 말해 줄 수 있습니까?

답변:


102

기본 키는 논리적 개념이며 테이블의 행에 대한 고유 식별자입니다. 따라서 많은 속성이 있습니다. null이 아닐 수 있으며 고유해야합니다. 물론, 고유 식별자로 레코드를 많이 검색 할 가능성이 높기 때문에 기본 키에 대한 인덱스를 갖는 것이 좋습니다.

클러스터형 인덱스는 물리적 개념으로, 레코드가 디스크에 저장되는 순서에 영향을주는 인덱스입니다. 따라서 기본 키가 순차 번호가 아닌 경우 쓰기 속도가 느려질 수 있지만 데이터에 액세스 할 때 매우 빠른 인덱스가됩니다.

예, 클러스터 된 인덱스없이 기본 키를 가질 수 있습니다. 때로는 원할 수 있습니다 (예 : 기본 키가 조인 테이블의 외래 키 조합이고 디스크 셔플 오버 헤드를 발생시키지 않으려는 경우) 쓸 때).

예, 기본 키가 아닌 열에 클러스터형 인덱스를 만들 수 있습니다.


1
안녕하세요. 주제는 오래되었지만 누군가 내 질문에 답할 수 있습니다. 열이 NOT NULL UNIQUE CLUSTERED INDEX로 선언되면 PRIMARY KEY로 만들면 성능이나 기타 사항이 실제로 변경됩니까?
제시

흥미로운 질문입니다. 어느 쪽이든 동일한 검사를 모두 수행해야하므로 아니오라고 가정합니다.
Jonathan Allen

훌륭한 대답입니다.
NikosV

그러나 대부분 클러스터 된 인덱스가있는 기본 키 열은 범위 검색을 많이 단순화하므로 유용합니다.
hunter_tech

34

테이블에는 클러스터되지 않은 기본 키가있을 수 있으며 클러스터 된 테이블에는 기본 키가 필요하지 않습니다. 따라서 두 질문에 대한 답은 '예'입니다.

클러스터형 인덱스는 모든 열을 리프 수준에 저장합니다. 즉, 클러스터형 인덱스에는 테이블의 모든 데이터가 포함됩니다. 클러스터형 인덱스가없는 테이블을 힙이라고합니다.

기본 키는 기본적으로 클러스터 된 고유 인덱스입니다. 기본적으로 기본 키를 만들 때 테이블이 아직 클러스터되지 않은 경우 기본 키가 클러스터 된 고유 인덱스로 만들어집니다. nonclustered옵션 을 명시 적으로 지정하지 않는 한 .

예, 어디 t1클러스터되지 않은 기본 키를 가지고 있으며, t2클러스터되지 않은 있지만 기본 키가 :

create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);

create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);

SQL Fiddle의 예.


19

우선, 인덱스 구성 테이블 및 클러스터형 인덱스를 살펴보십시오 . 실제로 Use the Index Luke 전체를 읽는 것이 좋습니다 ! 사이트를 처음부터 클러스터링 주제에 도달 할 때까지 실제로 무슨 일이 일어나고 있는지 이해합니다.

자, 질문에 ...


TABLE은 Clustered Index없이 기본 키를 가질 수 있습니까?

예, 힙 기반 테이블을 만들기 위해 기본 키를 선언 할 때 NONCLUSTERED 키워드를 사용하십시오. 예를 들면 :

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY NONCLUSTERED
    -- Other fields...
);

많은 경우에 힙 기반 테이블이 실제로 더 좋을지라도 (링크 된 문서에서 논의 된대로) 많은 사람들이 기본값 (클러스터 됨)을 받아들이는 것처럼 보이기 때문에 이것은 불행한 일입니다.


TABLE은 기본 키없이 클러스터형 인덱스를 가질 수 있습니까?

다른 DBMS와 달리 MS SQL Server는 기본 키와는 다르거 나 기본 키가 전혀없는 클러스터링 인덱스를 가질 수 있습니다.

다음 예제는 PK와는 별도로 클러스터링 인덱스를 생성하며, 그 위에 UNIQUE 제약 조건이 있습니다. 이는 대부분의 경우에 원할 것입니다.

CREATE TABLE YOUR_TABLE (
    YOUR_PK int PRIMARY KEY,
    YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
    -- Other fields...
);

고유하지 않은 클러스터링 인덱스 (사용 CREATE CLUSTERED INDEX ...)를 선택하면 MS SQL Server가 숨겨진 필드를 추가하여 자동으로 고유하게 만듭니다.

클러스터링의 이점은 범위 스캔에서 가장 잘 나타납니다. 클라이언트 애플리케이션에서 수행 한 범위 스캔과 "정렬"하지 않는 클러스터링 인덱스를 사용하는 경우 (예 : 위에서 언급 한 숨겨진 열에 과도하게 의존하거나 대리 키 에서 클러스터링하는 경우 ) 클러스터링의 목적을 무너 뜨리는 것.


누구든지 기본 키와 클러스터형 인덱스의 관계를 간단히 말해 줄 수 있습니까?

MS SQL Server에서는 기본 키도 기본적으로 클러스터링 됩니다 . 위에서 설명한대로 기본값을 변경할 수 있습니다.


4

클러스터형 인덱스를 사용하여 MSDN 에서 가져온 답변

TABLE은 Clustered Index없이 기본 키를 가질 수 있습니까? - 예.

TABLE은 기본 키없이 클러스터형 인덱스를 가질 수 있습니까? - 예.

기본 키는 A는 제약 보장하지만은 행이 항상 키에 의해 구체적으로 식별 할 수 있도록, 값의 고유성있다.

인덱스 (행이 종종 기본 키에 의해 "고개"대로) 자동으로 기본 키에 할당됩니다.

클러스터되지 않은 인덱스 의 열 중 하나 (또는 그 이상)에 의한 행의 논리적 순서입니다. 인덱스가있는 열에 따라 순서가 지정된 테이블의 또 다른 "복사본"이라고 생각하십시오.

클러스터 된 인덱스는 때입니다 실제 테이블이 물리적으로 특정 열을 기준으로 정렬됩니다. 테이블에 항상 클러스터 된 인덱스가있는 것은 아닙니다 (즉, 물리적으로 무언가 에 의해 정렬되지만 해당 항목정의되지 않을 수 있음 ). 테이블은 단일 복합 클러스터형 인덱스를 가질 수 있지만 둘 이상의 클러스터형 인덱스를 가질 수 없습니다 (즉, 테이블은 성, 이름, DOB에 따라 물리적으로 정렬 됨).

PK는 종종 (항상은 아님) 클러스터형 인덱스입니다.


SQL Server에서 기본 키는 명시 적으로 지정하지 않는 한 기본적으로 클러스터링됩니다. 그러나 이는 기본 사항 일 뿐이며 요구 사항은 아닙니다.
marc_s 2013

테이블에 인덱스없이 기본 키가있을 수 있습니까? 한 열이 기본 키라고 말하면 기본적으로 클러스터형 인덱스가 생성됩니다. 인덱스를 삭제할 때 테이블에 더 이상 기본 키가 포함되지 않습니까?
veljasije 2013 년

1

그만한 가치가 있기 때문에 MS SQL Server에서 기본 키의 모든 열은 NOT Null로 정의되어야하지만 고유 한 클러스터형 인덱스를 만들 때는이를 필요로하지 않습니다. 하지만 다른 DB 시스템에 대해서는 확실하지 않습니다.


이것은 정답으로 표시된 답변 아래에 더 많은 의견입니다.
Jan Doggen 2015

1
환영합니다. 댓글을 추가 할 평판이 아직없는 것으로 확인되어 +1을드립니다. (거기는 다 그 :)
반전 엔지니어

0

이 질문에 대한 대답과 관련이 없을 수도 있지만 기본 키 및 클러스터형 인덱스에 대한 몇 가지 중요한 측면은->

Clustered Index에 기본 키 (기본적으로 Clustered Index이지만 변경할 수 있음)가 있으면 해당 테이블에 대해 클러스터형 인덱스를 하나 더 만들 수 없습니다. 그러나 아직 기본 키 세트가없고 클러스터형 인덱스가있는 경우 클러스터형 인덱스로 기본 키를 만들 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.