2012-05-20 1 views
1

SET ALLOW_SNAPSHOT_ISOLATION ON 인 SQL Server 2008 데이터베이스와 열 ID (기본 키) 및 SSN (클러스터되지 않은 고유 인덱스)이있는 개인 테이블이 있습니다.SQL Server에서 스냅 숏 격리가 켜져있을 때 클러스터 된 인덱스는 어떻게 업데이트됩니까?

데이터베이스의 행 중 하나는 ID = 1, SSN = 776-56-4453입니다.

는 하나 개의 연결이 발생 하나 :

set transaction isolation level snapshot 
begin transaction snapshot 
while (1 = 1) select * from person where SSN = '777-77-7777' 

을 그리고 또 다른 연결 :

예상대로
update person set SSN = '555-55-5555' where ID = 1 

는, 첫 번째 연결도 '777-77-7777'로 SSN을 계속 표시 두 번째 연결이 실행을 마친 후에 첫 번째 연결에 대한 실행 계획에는 SSN에서 'clustered index seek'이 표시되지만 다른 연결에서 인덱스 키가 업데이트 된 경우 어떻게 첫 번째 연결에서 인덱스를 계속 사용할 수 있습니까?

SQL 서버는 여러 버전의 색인을 유지하기 위해 특별한 조치를 취합니까?

스냅 샷 격리 수준의 성능 특성을 이해하려고하므로 SQL Server가 행의 이전 버전에서 부실 데이터를 검색 할 때도 기존 인덱스를 사용할 정도로 똑똑하다는 것을 확인하고자합니다.

+1

스냅 샷 격리를 사용하면 SQL Server가 수정되는 데이터의 '스냅 샷'을 'tempDB'에 넣고 다른 연결은 거기에서 읽을 것입니다. 첫 번째 연결은 'tempDB'에서 스냅 샷 복사본과 관련된 값과 모든 관련 인덱스를 읽는 것입니다. –

답변

0

을 포함 모든 관련 인덱스를 읽고 (DBCC INDDBCC PAGEas described here을 사용하고 sys.dm_tran_version_store보고) 데이터베이스에 인덱스 키를 업데이트 할 때 스냅 샷 격리를 사용하면 다음이 발생합니다.

  1. 원본 행이 버전 저장소에 복사됩니다.
  2. 원래 행은 고스트로 표시되고 올바른 위치를 가리 키도록 버전 포인터가 업데이트됩니다.
  3. 새 키 값으로 새 행이 삽입됩니다.
  4. 나중에 ghost 정리 프로세스가 실행되고 행이 제거됩니다.

유일한 차이점은 유령 정리 프로세스가 미해결 스냅 숏 격리 트랜잭션에서 더 이상 필요하지 않을 때까지 행을 정리하지 않는다는 것입니다. 즉 BTree는 더 이상 필요하지 않을 때까지 이전 키 값과 새 키 값에 대한 행을 포함하므로 이전 값에 대한 인덱스 찾기가 이전처럼 작동 할 수 있습니다.

+0

우수 답변. 3 단계 : 테이블에 새로운 행이 생성되어 업데이트가 더 이상 행의 현재 위치 업데이트가 아니거나 색인 B- 트리에 새 키 값에 대한 행이 추가되었다고 말하는 것입니까? –

+0

@RaghuDodda - 클러스터 된 인덱스 키를 테스트했습니다. CI *의 리프 레벨은 * 테이블이므로 두 테이블 사이의 구별은 없습니다. –

0

스냅 샷 격리를 사용하면 SQL Server가 수정되는 데이터의 "스냅 샷"을 tempDB에 넣고 다른 연결은 거기에서 읽을 것입니다. 그래서 여기에 첫 번째 연결의 가치와 임시 데이터베이스

에 스냅 샷 복사본에서 지금까지 내가 말할 수있는