2012-11-02 5 views
0

SQL Server가 교착 상태 메시지를 반환하도록 설정을 개선하는 방법에 대한 제안을 받고 싶습니다. TaskParallel 라이브러리를 실제로 사용하는 여러 스레딩 응용 프로그램이 있고 각 작업은 저장된 프로 시저를 사용하여 테이블에서 ID를 선택하여 처리에 사용합니다. 나는 즉시 같은 성명의 테이블에서 그 id를 삭제하고 그것이 교착 상태의 원인이라고 생각한다. 이 테이블은 색인이없는 고유 ID의 한 열로 구성됩니다. 일괄 삭제를 주기적으로 수행하는 것을 고려했지만, 이는 여러 서버에서 사용 된 ID의 집계를 유지하는 것을 의미합니다.교착 상태 트랜잭션 - 통신 버퍼 리소스

CREATE PROCEDURE [dbo].[get_Ids] 
    @id nvarchar(20) OUTPUT 

    AS 

    BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
    SET NOCOUNT ON; 

     Select top 1 @id = siteid from siteids 
     delete siteids where siteid = @id 



    END 

이 작업을 수행하는 더 나은 방법이 있나요 : 여기

내 SQL 저장 프로 시저입니까? 내 프로세스는 매우 빠르게 작동하며 웹 요청 서비스에서이 ID를 요청했지만이 작업에는 3 초가 걸렸습니다.

답변

1

몇 가지 시도 : 아마도 DB에 힌트를 주시면 방금 선택한 레코드를 삭제할 것입니다. 이렇게하면 잠금을 일찍 잡을 수 있습니다. 이렇게하려면 트랜잭션에서 전체 프로 시저를 래핑 한 다음 선택을 힌트해야합니다. 의 모양은 다음과 같습니다

또한
BEGIN TRANSACTION 
    SELECT TOP 1 @id = siteid from siteids WITH (UPDLOCK, HOLDLOCK) 
    DELETE siteids WHERE siteid = @id 
COMMIT TRANSACTION 

siteid 열이 인덱싱되어 있는지 확인 (또는 당신이 유일하다 말을하기 때문에, 기본 키로 태그), 그렇지 않으면 삭제 기록을 얻기 위해 테이블을 스캔해야 , 그것은 더 많은 시간을 삭제하는 데 소비하기 때문에 교착 상태가 악화 될 수 있습니다.

일반적으로 교착 상태의 경우 SQL 프로파일 러를 실행하고 교착 상태 그래프가 어떻게 보이는지 확인하십시오. 다른 상황이 발생할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그의 원인은 하루에 약 5 천만 건의 거래가 발생하여 막대한 손실을 입을 것이며 초당 여러 스레드로 처리됩니다. 나는 그것을 시도 할 것이다. – vbNewbie

+0

@vbNewbie는 다른 단순한 선택 방법에별로 관심이 없습니다. 장소에 넣고 siteid 색인을 추가하고 어떻게 작동하는지 확인하십시오. 여전히 문제가있는 경우 - 새로운 세부 사항으로 다시 방문하십시오. nvvarchar 대신 정수를 사용하는 것이 더 빠를 수도 있습니다. siteid [link] (http://stackoverflow.com/questions/3284297/sql-server-int-vs-nvarchar-comparison-on-performance)를 참조하십시오. – MaximR

+0

여전히 교착 상태에 빠졌지 만 재시도 코드를 추가 했으므로 최소한 내 처리가 이전보다 훨씬 빠릅니다. 같은 DB에있는 테이블에 삽입하기 때문에 워크로드에 영향을 미칠지 궁금합니다. – vbNewbie