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


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.