문제

현재 기본 키에 NewID ()를 사용하는 여러 테이블이 있습니다. 이것은 많은 양의 조각화를 유발합니다. 따라서 열을 변경하여 대신 NewSevectiveId ()를 사용하고 싶습니다.

기존 데이터가 상당히 단편화 될 것이지만 새로운 데이터는 덜 단편화 될 것이라고 생각합니다. 이것은 PK 지수를 비 클러스터에서 클러스터로 변경하기 전에 시간을 기다려야한다는 것을 의미합니다.

내 질문은, 누구든지 이것을 경험 한 경험이 있습니까? 내가 조심해야 할 것을 간과 한 것이 있습니까?

도움이 되었습니까?

해결책

순서 가드로 전환하는 경우 그리고 인덱스를 한 번 동시에 재구성하면 조각화가 제거됩니다. 조각화 된 페이지가 연속 범위로 스스로를 재 배열 할 때까지 기다리는 이유를 이해하지 못합니다.

즉, 조각화가 실제로 시스템에 영향을 미친다는 것을 보여주기 위해 측정을 수행 했습니까? 색인을보고 '보는'단편은 75%'입니다. ~ 아니다 액세스 시간이 영향을 받았다는 것을 암시합니다. 더 많은 요소가 있습니다 (버퍼 풀 페이지 수명, 기대치 vs. 쓰기 비율, 순차적 운영의 지역, 동시 동의 등). 안내에서 순차적 인 Guids로 전환하는 것은 일반적으로 안전하지만 여전히 문제를 일으킬 수 있습니다. 예를 들어 인서트 집중 OLTP 시스템의 페이지 래치 경합을 볼 수 있습니다. 인서트가 축적되는 핫스팟 페이지를 생성하기 때문입니다.

다른 팁

당신은 사용에 대해 생각할 수 있습니다 빗 가이드, NewseatientiM과는 반대로.

cast(
    cast(NewID() as binary(10)) +
    cast(GetDate() as binary(6))
as uniqueidentifier)

COMB GUIDS는 현재 데이터 시간의 비 랜덤 성과 순수한 무작위 안내의 조합으로, 순차적 세대의 COMB GUID가 서로 가까이 있고 일반적으로 오름차순 순서로 나타납니다. Comb Guids는 블랙 박스가 아니라는 사실을 포함하여 NewsectientiMID에 비해 다양한 장점이 있으며, 기본 제약 조건 외부 에서이 공식을 사용할 수 있으며 SQL Server 외부 에서이 공식을 사용할 수 있다는 사실을 포함합니다.

감사합니다, Yfeldblum! Comb Guid에 대한 귀하의 간단하고 간결한 설명이 실제로 도움이되었습니다. 나는 실제로이 게시물의 반대를하고있는 것을보고 있었다 : 나는 의지에서 벗어나야했다. newsequentialid() SQL Server 2012 DB를 Azure로 마이그레이션하려고했기 때문에 newsequentialid() 기능은 거기에서 지원되지 않습니다.

다음 구문과 함께 모든 테이블 PK 기본값을 Comb Guid로 변경할 수있었습니다.

ALTER TABLE [dbo].[Company] 
ADD  CONSTRAINT [DF__Company__Company_ID__72E6D332]  
    DEFAULT (CONVERT([uniqueidentifier],CONVERT([binary](10),newid(),0)+CONVERT([binary](6),getdate(),0),0)) FOR [CompanyId]
GO

내 SQL2012 DB는 이제 Azure Cloud에 행복하게 살고 있습니다.

이것이 SQL Server 인 경우 NewID ()를 호출하여 GUID를 생성하는 것입니다. 이것은 기본 키에 좋지 않습니다. 기본 키에 정수 ID 열을 사용하고 GUID를 대리 키 (및 행 안내 열)로 만드십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top