나를 매우 즐겁게하는 하나의 가능한 시나리오 :
- 데이터베이스에 RCSI (Read Committed Snapshot), SI (Snapshot Isolation) 또는 AG (Availability Group)가 활성화되지 않은 경우 원래 행이 작성되었습니다.
- RCSI 또는 SI가 사용 가능하거나 데이터베이스가 가용성 그룹에 추가되었습니다
- 삭제 중에 RCSI / SI / AG 읽기를 지원하기 위해 삭제 된 행에 14 바이트 시간 소인이 추가되었습니다.
이 서버는 AG의 기본 서버이므로 보조 서버와 마찬가지로 영향을받습니다. 버전 정보는 기본에 추가됩니다. 데이터 페이지는 기본 및 보조에서 모두 동일합니다. 보조 저장소는 AG가 행을 업데이트하는 동안 버전 저장소를 사용하여 읽기를 수행하지만 보조 버전은 자체 타임 스탬프 버전을 페이지에 쓰지 않습니다. 그들은 단지 기본 작품에서 버전을 상속받습니다.
증가를 보여주기 위해 Stack Overflow 데이터베이스 내보내기 (RCSI가 활성화되지 않은)를 가져 와서 Posts 테이블에 많은 인덱스를 만들었습니다. sp_BlitzIndex @Mode = 2 (스프레드 시트에 복사 / 붙여 넣기 및 정보 밀도를 최대화하기 위해 약간 정리)로 인덱스 크기를 확인했습니다.
그런 다음 행의 약 절반을 삭제했습니다.
BEGIN TRAN;
DELETE dbo.Posts WHERE Id % 2 = 0;
GO
흥미롭게도 삭제가 진행되는 동안 타임 스탬프를 수용 할 수 있도록 데이터 파일도 커졌습니다! SSMS 디스크 사용량 보고서에는 증가 이벤트가 표시됩니다.
삭제로 인해 데이터베이스가 커지는 데모를 좋아합니다. 삭제가 실행되는 동안 sp_BlitzIndex를 다시 실행했습니다. 클러스터형 인덱스는 행 수가 적지 만 크기는 이미 약 1.5GB 증가했습니다. AcceptedAnswerId의 비 클러스터형 인덱스는 급격히 증가했습니다. 대부분 null 인 작은 값에 대한 인덱스이므로 인덱스 크기가 거의 두 배가되었습니다!
삭제가 완료 될 때까지 기다릴 필요가 없으므로 데모를 중단하겠습니다. 요점 : RCSI, SI 또는 AG를 사용하기 전에 구현 된 테이블에서 큰 삭제를 수행하면 클러스터를 포함한 인덱스가 실제로 버전 저장소 타임 스탬프의 추가를 수용하기 위해 커질 수 있습니다.