2010-01-05 3 views
1

SQL2k5를 사용하여 많은 다른 테이블을 채울 열이 포함 된 준비 테이블을 가지고 있습니다. 예를 들어, 이런 성명 :TSQL 스냅 샷 격리

INSERT INTO [appTable1] ([colA], [colB]) 
SELECT [appTable1_colA], [appTable1_colB] 
FROM [stageTable] 

[appTable1] 다시 [stageTable]에 새로 삽입 된 행의 ID 열 값을 채울에 트리거; 이 예에서는 [stageTable]. [appTable1_ID]라고 말한 다음 다른 테이블에 FK로 삽입합니다. 유사한 문은 다음과 같습니다.

INSERT INTO [appTable2] ([colA], [colB], [colC], [appTable1_FK]) 
SELECT [appTable2_colA], [appTable2_colB], [appTable2_colC], [appTable1_ID] 
FROM [stageTable] 

이 프로세스는 이와 같이 수많은 테이블을 통해 계속됩니다. 보시다시피,이 테이블은 프로세스가 끝날 때 잘 리면 준비 테이블의 SELECT에 WHERE 절을 포함하지 않습니다. 그러나 이로 인해이 트랜잭션 중간에이 준비 테이블에 레코드를 추가하는 다른 프로세스가있을 수 있으며이 레코드에는 이전에 채워진 FK가 포함되지 않습니다. 이 문제를 방지하기 위해이 성명서를 발표하고 싶습니까? :

이것이 최선의 해결책이라면 어떻게 이런 식으로해야할까요?

답변

1

스테이징 테이블에 배치 ID를 추가하여 orig 절에서만 작업 할 수 있도록 where 절에서 사용할 수 있도록 할 수 있습니까? 레코드 일괄 처리? 스테이징 테이블에 레코드를 추가하는 모든 프로세스는 새 고유 한 배치 ID를 사용해야합니다. 이것은 스냅 샷 격리에 의존하는 것보다 더 효율적이며 강력합니다.

+0

이것이 내 최고의 코스라고 생각합니다. 감사. – heath

1

모든 격리 수준 (스냅 샷 포함)은 읽기에만 영향을줍니다. stageTable의 SELECT는 커밋되지 않은 삽입을 보지 않으며 차단하지 않습니다. 소유권을 전혀 고려하지 않고 모든 것을 스테이지 테이블에 던지려는 문제를 해결하는지 확신 할 수 없습니다. 트랜잭션이 최종적으로 커밋 될 때 어떤 일이 발생합니까? stageTable은 모든 중간 결과가 다음 트랜잭션에서 읽을 준비가 된 채로 남아 있습니까? 아마도 동시 스레드 간의 자연스러운 격리를 보장하는 임시 #stageTable을 사용해야합니다.

스냅 샷 격리를 사용하는 비용을 이해하기 Row Versioning Resource Usage을 읽어

  • tempdb의 소비 여분의 공간
  • 여분의 공간을 위해 BLOB 스토리지에서 소비되는 데이터 테이블의 각 행에서 소비
  • 여분의 공간 큰 필드
+0

고마워요, 이것은 도움이되며 격리 수준을 사용하는 것이 내 해결책이 아님을 확신합니다. – heath