멋진 기사 The Cost of GUIDs as Primary Keys 덕분에 COMB GUID가 있습니다. 타임 스탬프타임 스탬프의 경우 8 바이트 또는 SQLServer의 COMB GUID의 타임 스탬프의 경우 6 바이트
- 사용 지난 6 바이트 : 사용하여 타임 스탬프 GUIDs as fast primary keys under multiple databases
- 사용 지난 8 바이트 창 틱 : 현재 구현을 바탕으로 2 가지가 있습니다 GUID COMB strategy in EF4.1 (CodeFirst)
는 우리 모두에 대한 것을 알고있다 GUID에서 6 바이트 타임 스탬프, GUID의 충돌을 줄이기 위해 임의 바이트에 대해 더 많은 바이트가 있습니다. 그러나 동일한 타임 스탬프가있는 GUID가 더 많이 생성되고 순차적으로 정렬되지 않습니다. 이를 통해 8 바이트 타임 스탬프가 선호됩니다.
그래서 어려운 선택입니다. GUIDs as fast primary keys under multiple databases 위의 문서를 기반으로, 그것은 말한다 :
우리는이 방법에 대한 짧은 각주를 계속하기 전에 : 1 밀리 초 해상도의 타임 스탬프를 사용하는 GUID가이 같은 타임 스탬프 값을 가질 수 서로 매우 가까운 생성 등을 의미 순차적이지 않습니다. 일부 응용 프로그램에서는이 문제가 자주 발생하며 실제로 System.Diagnostics.Stopwatch와 같은 고해상도 타이머를 사용하거나 시퀀스를 보장하는 "카운터"와 타임 스탬프를 결합하는 등의 몇 가지 대체 방법을 실험했습니다 타임 스탬프가 업데이트 될 때까지 계속되었습니다. 그러나 테스트를하는 동안 동일한 1 밀리 초 창 내에서 수십 또는 심지어 수백 개의 GUID가 생성되는 경우에도 식별 할 수있는 차이가 전혀 없음을 발견했습니다. 이것은 지미 닐슨 (Jimmy Nilsson)이 COMBs를 테스트하는 과정에서 겪었던 것과 일치합니다.
내부 데이터베이스를 아는 사람이 위의 관찰에 대해 몇 가지 조명을 공유 할 수 있는지 궁금합니다. 데이터베이스 서버가 메모리에 데이터를 저장하고 특정 임계 값에 도달하면 디스크에 쓰기 만하기 때문입니까? 따라서, 동일한 타임 스탬프를 갖는 비 시퀀스 GUID를 갖는 삽입 된 데이터의 재정렬은 일반적으로 메모리에서 발생하여 성능 페널티를 최소화 할 수있다.
업데이트 : COMB GUID는 임의 GUID와 비교하여 COMB GUID가 인터넷을 통해 청구됨에 따라 테이블 조각화를 줄일 수 없습니다. 지금 SQL Server를 사용하여 순차 GUID를 생성하는 것이 유일한 방법 인 것 같습니다.
나는 나열된 모든 기사가 * 클러스터 된 색인 키 *로 기본 키 *를 혼란스럽게 생각한다고 생각합니다. GUIDS는 특히 다중 마스터 상황에서 주요 키로 작동하지만 클러스터 된 인덱스 키로는 잘 작동하지 않습니다 ("잘 작동하지 않지만"은 테이블에있는 다른 열에 따라 다름). –
예, 당신 말이 맞습니다. 우리의 주된 관심사는 우리 테이블에 클러스터 된 PK 인 GUID의 무작위로 인해 많은 단편화가 발생한다는 것입니다. 동일한 타임 스탬프 내에서 임의 GUID의 성능에 대한 위의 내 질문에 대한 의견? – windfly2006
클러스터 된 인덱스 키로 사용할 다른 열이 없다면'newsequentialid()'(아래 @ErikE에서)로 이동합니다. –