2

나는 나의 SQL 서버에서 두 개의 컬럼으로 구성되어 2005 데이터베이스를 접합 테이블이 복합 기본 키.SQL Server : uniqueidentifier와 정수 복합 PK ... 사용할 인덱스 유형? 함께</p> <ul> <li><p>OBJECT_ID (고유 식별자)</p></li> <li><p>PROPERTY_ID (정수)</p></li> </ul> <p>이 값합니다

SELECT 성능을 위해이 PK 인덱스를 만드는 가장 좋은 방법은 무엇입니까?

열이 두 개의 정수인 경우 복합 클러스터 인덱스 (기본값)를 사용합니다. 그러나 uniqueidentifier가 관련되어있을 때 클러스터 된 인덱스에 대해 나쁜 소식을 들었습니다.

누구나이 상황에 경험이 있습니까?

답변

2

예, GUID가 매우 임의적으로 설계되어 대규모 조각화 및 성능 문제가 발생하므로 GUID는 클러스터형 인덱스에 실제로 적합하지 않습니다.

Kim Tripp의 블로그 - 특히 "The CLustered Index Debate continues"및 "GUIDs as PRIMARY and/or CLUSTERED key"- 유용한 배경 정보가 많이 있습니다.

이 두 개의 열에 대한 색인이 정말로 필요한 경우 클러스터되지 않은 색인 - 기본 색인이 될 수 있음 - 클러스터 된 색인이 아닌 것이 좋습니다.

마크

+0

해당 클러스터되지 않은 키에 포함됩니다. – GrumpyMonkey

0

나는 내가 다음 ID 열 &을 만들이 기본 키 & 클러스터 된 인덱스를 만들 것입니다. 그런 다음 필요에 따라 objectid propertyid에 클러스터되지 않은 색인을 작성할 수 있습니다.

키의 고유성을 보장하기 위해 고유 제한 조건을 만들 수 있습니다.

줄이 연속적으로 삽입되므로 줄이기 페이지가 분할됩니다. 또한 PK에 정수를 사용하면 클러스터 된 인덱스에 대해 더 작은 값을 갖게됩니다.

+1

ObjectID 및 PropertyID에 고유 한 제약 조건이 있어야합니다. –

0

대용 암호 키 (우발적으로 기본 키로 할당 될 수 있음)를 사용하는 것이 한 가지 대안입니다.

예를 들어 테이블의 각 행, 즉 기본 키를 고유하게 식별하는 데 사용할 수있는 ID 열을 추가하십시오.

GUID가 SQL Server 내에서 레코드를 전체적으로 식별하는 데 사용된다는 점을 이해해야합니다. (논리적으로는 올바른 관계는 아니지만 여기서 우리에게 중요하지 않습니다.)

이제 기본 키인 ID 열에도 클러스터 된 인덱스를 적용 할 수 있습니다. 그런 다음 비 클러스터형 인덱스를 원래 포스터에서 설명한 복합 키에 적용 할 수 있습니다.

이 방법을 사용하면 클러스터 된 인덱스 (임의의 GUID 기본 키에 삽입)에서 발생하는 페이지 분할이 자주 발생하지 않도록하고 작고 효율적인 클러스터 된 인덱스를 생성하고 데이터베이스 내에 정의 된 관계를 보존 할 수 있습니다.

대리 키 정의 : http://en.wikipedia.org/wiki/Surrogate_key Marc_s과 같이 그 나쁜 생각을 주장했다으로 순차적 GUID를 사용하는 옵션 (NEWSEQUENTIALID를, 당신이 함수로 직접 호출 할 수 없기 때문에 한계가 있습니다.)를이