2013-02-25 3 views
1

많은 컬럼이있는 Products라는 테이블이 있습니다.동시 삭제를위한 교착 상태를 피하십시오

보고 용도로 사용되는 임시 테이블입니다. 데이터는 다수의 사용자의 요청에 의해 동시에이 테이블에 처리 될

테이블 구조 (표에 DML 작업을 저장 프로 시저를 분리해서). 테이블 제품을 (인스턴스의 고유 식별자, 삽입 날짜, COL1 만들기 COL2을 , ...)

데이터를 삽입 할 때 삽입 된 열에 GETDATE()가 채워집니다. 인스턴스 열은 newid() 값을가집니다. 하나의 사용자 요청에는 하나의 고유 ID가 있습니다. 백만 행이있을 수 있습니다. 아래는 동시 적으로 실행될 질의이며 교착 상태의 원인이됩니다. 나에게

에 Query1을 알려 주시기 바랍니다 : "설정 트랜잭션 격리가 삭제 READUNCOMMITTED : 이

QUERY2"설정 트랜잭션 격리가 예를 = 'XXXX-XXX--XXX XX'제품 (NOLOCK)에서 P를 삭제 READUNCOMMITTED " P (Nolock) 제품에서 삽입 된 위치 < = DATEADD (hh, -10, getdate()) "

참고 : 비 클러스터형 인덱스는 인스턴스 열에 만들어집니다.

이 시나리오에서 사용할 수있는 잠금 장치를 알려주십시오.

참고 테이블에 1,000 만 개의 행을 삽입 할 때 기본 키를 사용할 수 없습니다 (하나의 트랜잭션에 대해 20 개의 동시 변환이 있음). 보고서가 더 빨리 생성되어야합니다. 그리고 내 프로 시저에는 여러 개의 35 DML 구문이 있습니다. 예를 들어 다른 열 (인스턴스가 @instance이고 col1이 @ col1 인 테이블의 DElete)과 함께 약 15 개의 DELETE 문이 있습니다.

+0

http://stackoverflow.com/questions/9952137/multi-threading-c-sharp-application-with-sql-server-database-calls/10035988#10035988 – Phil

답변

5

(1) read uncommitted 격리를 중지해야합니다. 적어도 read committed 이상을 사용하십시오.

(2)이 읽기 가치가있을 것 등, 같은 순서에 다른 거래 액세스 데이터베이스 오브젝트를 보장 같은 교착 상태를 방지하기 위해 여러 가지가 시도 할 수 있습니다 - http://support.microsoft.com/kb/169960

(3) 테이블에 대한 잠금 에스컬레이션 (보다 세분화 된 잠금 때문에 더 나은 동시성, 더 잠금 오버 헤드)를 사용 안 함 :

alter table Products set lock_escalation disable 

(4) 허용 안 페이지 잠금, 그리고 (당신이 인덱스를 조각 모음 할 수없는 의미합니다 당신의 인덱스에서 행 잠금을 허용, 그러나 당신은 아직도 그 (것)들을 재건 할 수있다 :

alter index [<YourIndex>] on Product set (allow_row_locks = on, allow_page_locks = off) 
1

먼저 독점적 인 잠금 외에 삭제 명령문을 사용할 수있는 잠금 기능이 없습니다. 사용자의 isolation level and NOLOCK hints are being ignored by Sql Server :

(Nolock) SELECT 문에만 적용됩니다.

두 가지 제안 :

클러스터 된 인덱스에 instance에 당신의 클러스터되지 않은 인덱스를 변경

.하지만 NEWID()NEWSEQUENTIALID()으로 변경할 수있는 경우에만이 작업을 수행하십시오.

둘째, delete을 수행하여 10 시간보다 오래된 레코드를 제거하는 대신 implementing rolling partitions을 고려하십시오. 이렇게하면 다른 delete 작업으로 정리로 인해 발생한 모든 경합이 제거됩니다.

관련 문제