2012-05-16 3 views
1

나는이 아주 새로운 해요 *, I 수도 (아마 것?) 정정 해줘 주시기, 이제 다음 몇 가지 jibberish을 얘기) 내가 놀아있어병합 두 테이블, 중복 키는

다른 기본 키/인덱스 전략과 다음에 대해 궁금해했다. GUID를 기본 키로 선택하는 경우 대부분의 데이터베이스에서 레코드를 고유 한 ID로 제공하는 경우가 많습니다.

GUID를 기본 키 (및 클러스터 된 인덱스로 사용하는 기본 동작)로 사용하면 성능 문제가 발생합니다. NEWSEQUENTIALID()를 사용하거나 추가 IDENTITY 열을 추가하여 순차 클러스터형 인덱스를 제공하는 것과 같이 생각할 수있는 몇 가지 대안이 있습니다.

또 다른 하나는 기본 키 (및 인덱스)의 GUID를 함께 제거하는 동시에 외부 식별자/ROWID를 통해 고유 한 식별을위한 열을 제공합니다. 작은 테이블을 남깁니다. 물론 추가 열의 16 바이트 페널티가 있지만 몇 개의 FK가있는 테이블에서는이 열이 빠르게 줄어 듭니다. 페이지에 더 많은 것들, 좋은 순차적 인 ID, 작은 인덱스 공간, 그래서이기십시오.

그러나이 방법을 사용하면 두 가지 테이블을 병합하려는 경우 중복 키로 인해 막히게됩니다. 이제는이 접근법을지지하지 않습니다. 저는 데이터베이스 설계의이 부분에 좀 더 정통하게하기 위해 다양한 전략을 탐색하고 비교하는 것일뿐입니다.

질문 :이 문제에서 중복 키 문제를 해결하기 위해 GUID의 고유성을 어떻게 사용할 수 있습니까? 테이블 제한 조건을 모두 비활성화하고 테이블이 병합되면 IDENTITY를 생성해야합니까? 이 접근법을 완전히 폐기해야합니까?

답변

4

하지 않는 한 GUID를에서 체류하는 경향이 조금도. NEWSEQUENTIALID()는 페이지 분할과 관련하여 NEWID()보다 더 좋은 옵션이지만, 대부분의 경우에 필요한 것보다 더 넓은 키이며 여전히 은 GUID의 다른 이점 인을 잃게됩니다 (사전에 생성 할 수 있습니다. NEWSEQUENTIALID()로 할 수 없습니다). 그러나 IDENTITY 값과 비슷한 핫스팟 문제는 여전히 남아 있으며 동일한 삽입 작업이 모두 동일한 범위에서 발생합니다. 그래서 그것은 당신을 정말로 얻었습니까?

다음은 시스템에서 고유 한 키 값을 유지해야하는 다중 인스턴스 시스템에서 GUID를 피하기 위해 구현 한 두 가지 접근 방식입니다. 여러 서버에서 ID 값을 생성하고 나중에 (성장을위한 충분한 여백) 그 사용 정체성의 범위를 병합해야하는 경우


정체성

범위.서버 하나에 :

서버 두에
CREATE TABLE dbo.Data 
(
    ID BIGINT IDENTITY(1000000000, 1) PRIMARY KEY 
); 

:

CREATE TABLE dbo.Data 
(
    ID BIGINT IDENTITY(2000000000, 1) PRIMARY KEY 
); 

당신은 당신이 사용하는 것 같아 얼마나 많은 값에 따라 INT를 사용할 수 있습니다 - 미리 계획 할 수 있지만, 더 많이 남겨 나중에 모든 것을 바꿔야하는 것보다. 많은 양의 데이터를 생성하지 않는 한 수세기 동안 충돌에 대해 걱정할 필요가 없습니다.

키 크기 : 8 바이트. (또는 4 바이트 여전히 당신이 INT를 사용합니다.)


복합 키

또 다른 방법은 테이블에 서버 ID 열이, 그리고 그 부분을 확인하는 것입니다 복합 열쇠 255 개 이상의 서버를 확장 할 계획이 아니라면 TINYINT (1 바이트)를 사용할 수 있습니다.

CREATE TABLE dbo.Data 
(
    ServerID TINYINT NOT NULL DEFAULT 1, 
    DataID INT IDENTITY(1,1), 
    PRIMARY KEY (ServerID, DataID) 
); 

서버 두 가지의 경우 : 서버 하나에

CREATE TABLE dbo.Data 
(
    ServerID TINYINT NOT NULL DEFAULT 2, 
    DataID INT IDENTITY(1,1), 
    PRIMARY KEY (ServerID, DataID) 
); 

지금 당신은 병합 된 시스템에 FKS 주위 모두 열을 전달 (또는 병합에 IDENTITY 열을 생성)해야합니다 .. 조인은 좀 더 고통 스럽지만 GUID를 옮기는 것보다 훨씬 가볍습니다.

키 크기 : 5 바이트.(당신이 단계가 필요한 경우 255 개 서버가 충분하지 않기 때문에 또는 6 바이트, SMALLINT 수 있습니다.)

+0

이 유용한 게시물에 감사드립니다. 다른 사람들로부터 더 많은 통찰력을 얻는 것이 좋습니다. :) – fuaaark

0

호기심에서 벗어나 병합의 목적은 무엇입니까?

개인적으로 나는 정체성 접근 방식을 취할 것입니다. 클러스터 된 인덱스가 ID 값이면 ID가 행에 고유 값을 제공하고 FK가 필요하지 않은 것으로 가정하여 병합 중에 ID 삽입 ON을 설정하는 것은 데이터 무결성을 손상시키지 않습니다). 나는 당신이 GUID 필요가 있다고 생각하지 않는 충돌이

그것은 당신의 사용 사례에 따라

를 발행하지 않고 새로운 행은 새로운 ID로 표에 끝날 것 그러나 나는 멀리 필요

+0

을 몇 가지 외부 키 열에 관한 이야기가 있기 때문에, 내가 생각하는 원래의 IDENTITY 값은 할 수 없습니다 그냥 버려야 해. –

+0

나는 FK가 다른 칼럼을 가리키고 있지만 좋은 포인트라고 가정했다. – Charleh