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

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

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

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



답변

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

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

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

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


답변

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

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

기본 키는 기본적으로 클러스터 된 고유 인덱스입니다. 기본적으로 기본 키를 만들 때 테이블이 아직 클러스터되지 않은 경우 기본 키가 클러스터 된 고유 인덱스로 만들어집니다. 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의 예.


답변

우선, 인덱스 구성 테이블 및 클러스터형 인덱스를 살펴보십시오 . 실제로 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에서는 기본 키도 기본적으로 클러스터링 됩니다 . 위에서 설명한대로 기본값을 변경할 수 있습니다.


답변

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

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

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

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

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

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

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

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


답변

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


답변

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

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


답변