삭제 명령문의 교착 상태


11

SQL Server 작업이 실행될 때 교착 상태가 발생합니다. 교착 상태는 간단한 DELETE 문에서 발생합니다. 교착 상태를 유발하기 위해 SELECT / UPDATE 쿼리가 실행 중이어야한다고 생각 했습니까? 그러나 DELETE / DELETE 교착 상태 인 것 같습니다 ...

내가 찾고있는 것은 왜 DELETE / DELETE 교착 상태가 발생하는지입니다. 그것은 다른 매개 변수를 전달하는 것입니다.

어떤 아이디어? 감사.

deadlock-list
2014-05-20 07:30:09.66 spid25s      deadlock victim=process409048
2014-05-20 07:30:09.66 spid25s       process-list
2014-05-20 07:30:09.66 spid25s        process id=process409048 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127294 waittime=4352 ownerId=629860973 transactionname=DELETE lasttranstarted=2014-05-20T07:30:05.307 XDES=0x397219620 lockMode=U schedulerid=5 kpid=3792 status=suspended spid=150 sbid=0 ecid=3 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:05.307 lastbatchcompleted=2014-05-20T07:30:05.307 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629860973 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2
2014-05-20 07:30:09.66 spid25s     DELETE FROM dbo.UserDetailsData WHERE        (Username = @P1) AND (UserDate = @P2)     
2014-05-20 07:30:09.66 spid25s          frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
2014-05-20 07:30:09.66 spid25s     unknown     
2014-05-20 07:30:09.66 spid25s         inputbuf
2014-05-20 07:30:09.66 spid25s        process id=process432e08 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127916 waittime=2648 ownerId=629859744 transactionname=DELETE lasttranstarted=2014-05-20T07:30:04.833 XDES=0x4c3426b50 lockMode=U schedulerid=6 kpid=5988 status=suspended spid=146 sbid=0 ecid=3 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:04.833 lastbatchcompleted=2014-05-20T07:30:04.820 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629859744 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2
2014-05-20 07:30:09.66 spid25s     DELETE FROM dbo.UserDetailsData WHERE        (Username = @P1) AND (UserDate = @P2)     
2014-05-20 07:30:09.66 spid25s          frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
2014-05-20 07:30:09.66 spid25s     unknown     
2014-05-20 07:30:09.66 spid25s         inputbuf
2014-05-20 07:30:09.66 spid25s        process id=process39ea562c8 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127916 waittime=4352 ownerId=629860973 transactionname=DELETE lasttranstarted=2014-05-20T07:30:05.307 XDES=0x13e0e4b50 lockMode=U schedulerid=2 kpid=7124 status=suspended spid=150 sbid=0 ecid=1 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:05.307 lastbatchcompleted=2014-05-20T07:30:05.307 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629860973 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2

5
아니요, 교착 상태는 SELECT / UPDATE 외부의 다른 시나리오에서 발생할 수 있습니다. 실제로 필요한 것은 각각 다른 하나가 보유하고있는 자원이 필요한 두 개의 프로세스입니다. (1) DELETE 문이 더 큰 거래의 일부입니까? (2) 크 래피 오류 로그 텍스트 대신 교착 상태 XML을 어딘가에 게시 할 수 있습니까?
— Aaron Bertrand

dbo.UserDetailsData모든 인덱스 를 포함 하는 테이블 스키마를 게시 할 수 있습니까? 또한 해당 명령문이 동일한 매개 변수로 호출되는지 알고 있습니까? 두 가지 모두 로그가 사용되지 않았다면 전화가 서로 스테핑하기 때문에 통화를 직렬화하는 것만 궁금합니다.
— Jon Seigel

XML은 어떻게 얻습니까? SQL Server 오류 로그에서 오류가 발생했습니다. 명령문은 다른 매개 변수로 호출됩니다. 최근에 UserDate 필드를 필터링하는 여러 개의 필터링 된 인덱스가 추가되었습니다.
— K09

프로파일 러에서 교착 상태 그래프 이벤트를 포착하십시오. 그런 다음 잡은 후 행을 마우스 오른쪽 버튼으로 클릭하고-이벤트 데이터 추출-> .xdl로 저장하고 Pastebin (또는 유사한 곳)에 내용 (XML)을 게시하십시오.
— 마리안

1
안녕하세요, XML이 여기에 게시되었습니다. dl.dropboxusercontent.com/u/16953128/DeadlockTest.xdl
— K09

답변:


14

내가 찾고있는 것은 왜 DELETE / DELETE 교착 상태가 발생하는지입니다.

교착 상태는 다음과 같은 이유로 발생합니다.

  1. spid 54 ecid 0에 업데이트 ( U) 페이지 잠금을 얻습니다 .PAGE: 12:1:5147422
  2. spid 166 ecid 3U같은 페이지에서 업데이트 ( ) 페이지 잠금을 요청하고 차단됨
  3. spid 54 ecid 2U같은 페이지에서 업데이트 ( ) 페이지 잠금을 요청합니다 ...

에 의해 획득 된 업데이트 잠금과 ​​함께 페이지가 쿼리에 대해 프리 페치됩니다 ecid 0. 위의 1 단계입니다. 3 단계에서 동일한 병렬 쿼리 ( ecid 2) 의 하위 스레드가 동일한 잠금을 요청합니다. 일반적으로 이것은 문제가되지 않습니다. SQL Server는 알고 ecid 0와 ecid 2같은 부모 프로세스의 스레드입니다. 불행히도 2 단계는이 과정을 방해하고 교착 상태가 발생합니다.

즉, 교착 상태가 발생 하는 이유 에 대해별로 신경 쓰지 않아야 하며 중요한 질문은 어떻게 피해야하는지입니다. 대답은에 대한 효율적인 액세스 경로를 제공하는 것 DELETE입니다. 명령문은 rows를 찾아야 WHERE Username = @P1 AND UserDate = @P2하므로이 열에 키를 입력해야합니다.

그리고 물론 당신은 그러한 색인을 가지고 있습니다. 진짜 문제는 문제가 필터링 된 인덱스를 추가 한 후 발생하는 시작하는 이유입니다.

이에 대한 대답은 필터링 할 인덱스 행을 찾아 삭제하고 조건자를 확인하기 위해 추가 열 정보가 필요하다는 것입니다. 쿼리가 행 / 좁은 행 실행 계획 을 사용하는 경우 실행 엔진은 너비 / 인덱스 계획에서와 같이 클러스터형 인덱스 삭제 연산자에서 추가 열을 페치 할 수 없습니다.

이 블로그 게시물에서 이에 대한 자세한 내용과 예제 를 찾을 수 있습니다 .

이 경우 열 정보는 계획의 일부에서 클러스터형 인덱스 삭제 오른쪽으로 가져와야하므로 병렬 클러스터형 인덱스 스캔이 사용되므로 교착 상태 가능성이 높은 쿼리가 느려집니다.

대답은 다음 중 하나를 수행하는 것입니다.

  1. 필터링 된 인덱스 제거
  2. 기존 이름 / 날짜 색인에 필터링 된 색인 키 / 포함 / 조건 자 열 추가
  3. 광범위한 업데이트 계획 시행 ( 지원되는 방법 없음 )
  4. 스냅 샷 격리 (RCSI 아님)에서 쿼리 실행

옵션 2는 제가 선호하는 것입니다.

옵션 4 (Jack Douglas에게 감사)는 교착 상태를 제거 할 수 있다는 이점이 있으며 변경의 불연속적인 특성을 고려할 때 "업데이트 충돌"을 발생 시키지 않아야 하지만 데이터베이스 수준에서 스냅 샷 격리를 활성화하고 격리 수준을 명시 적으로 변경해야합니다. 그리고 근본적인 문제를 해결하지 않을 것이다 : 당신은 여전히 좋은 지수는 당신이 정말로 원하는 무엇을 추구 낭비 병렬 테이블 스캔, 될 겁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.