2011-10-31 3 views
0

제목으로 병렬 저장 프로 시저를 실행하는 방법은 무엇입니까?저장 프로 시저 실행 병렬 처리

자세한 내용은 SQL Server에서 생성 된 저장 프로 시저가 Execute_Sql을 호출하고 하나의 매개 변수 AreaID INT를 인수로 전달합니다.

나는 New_ID를 얻기 위해 ID를 반복하면서 한 번에 하나의 ID를 전달함으로써 .net C#에서 성공적으로 호출하고 실행했다.

여기 내 문제는 저장 프로덕션을 실행하는 병렬 방식을 시도하고 있습니다. 예를 들어 ID = 1을 실행하는 경우와 마찬가지로, 동시에 ID = 2를 실행했습니다.

Whats 처리의 병렬 방식을 만든 스레드에서 내 마음에 왔어. 저장된 제품을 실행하면 어떤 방법이 있나?

+1

아마도 'AreaID'를 여러 개 가져 와서 SQL 서버에서 한 번에 모든 처리를 수행하는 새로운 저장 프로 시저를 작성할 수 있습니다. –

+0

@CoryLarson은 귀하에게 동의했지만 처리 진행 상황을 보여줄 필요가있을 수 있습니다. – Damith

답변

0

당신은 당신이 다른 방법을 통해 당신의 매개 변수를 얻을 필요가 거라고, 그래서 당신은 그러나 작업에 매개 변수를 전달할 수 sp_start_job

조사 할 수있다.

작업을 설정하여 테이블에서 매개 변수를 읽고 sproc을 실행하려는 값으로 테이블을 채운 다음 해당 작업에 대한 호출을 여러 번 실행할 수 있습니다.

작업간에 작업의 중복을 막기 위해 비트 플래그 또는 행의 일부를 업데이트하여 작업중인 행을 표시 할 수 있습니다. 당신이 당신의 코드를 게시하는 경우 우선 들어

http://msdn.microsoft.com/en-us/library/ms186757.aspx

0

도움이 될 것입니다. 매우 자주 "Set-based"방식으로 여러 값을 처리하도록 SQL을 수정할 수 있습니다. 즉, 처리 할 값 집합이있는 경우 모두 처리 할 수 ​​있습니다.

이렇게하려면 여러 가지 방법이 있습니다. 구분 된 문자열을 전달한 다음 proc에서 해당 문자열을 구문 분석 할 수 있습니다. 이 구현에 대한 많은 아이디어

또한 XML을 전달하고 APPLY을 사용하여 proc의 XML에 "조인"할 수도 있습니다.

당신은 내가 당신이 AreaID 매개 변수와 함께 일을하는지 정확히 알고하지 않기 때문에 Table Valued Parameters

, 내가 모르는 사용할 수 있습니다 2008+ SQL에서

내가 지금 여기에 귀하의 질문에 대답 한 경우는 좀 더 정보.

저장 프로 시저를 비동기 적으로 실행하려면 Service Broker를 사용하면 매개 변수를 큐에 넣을 수 있고 별도의 스레드가 큐를 처리 할 수 ​​있습니다. SQL은 모든 순서, 잠금, 다시 시도, 스레드 생성/제거 등을 관리합니다. 매우 견고한 시스템입니다.

진행 추적과 관련하여 OP에 연결되어있는 것으로 보이는 다른 사용자의 질문에 대한 의견이 있습니다. 다음은 생각입니다.

배치 ID와 areaID 매개 변수 및 상태 플래그가 포함 된 "대기열"테이블이 있습니다.귀하의 응용 프로그램 및 호출 (그룹 귀하의 요청)

에 대해 고유 한 배치 ID로 큐 테이블에

CREATE TABLE asynchQueue 
(
    RecNo INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
    BatchID INT, 
    AreaID INT, 
    Status TINYINT 
) 

귀하의 C# 응용 프로그램의 삽입이 같이 정기적으로 실행되도록 예약 발동 있습니다

CREATE PROC ProcessQueue 
AS 
BEGIN 
    SET XACT_ABORT ON 

    DECLARE @RecNo INT, 
      @AreaId INT 

    BEGIN TRAN 
     SELECT TOP 1 @RecNo = recNo, 
       @AreaID = areaId 
     FROM AsynchQueue WITH ROWLOCK, XLOCK 
     WHERE Status = 0 

     UPDATE AsynchQueue SET Status = 1 --Mark record as in progress 
     WHERE RecNo = @RecNo 
    COMMIT 

    EXEC YourProc @AreaId 

    UPDATE AsynchQueue SET Status = 2 -- Mark Record as complete 
     WHERE RecNo = @RecNo   

END 

또는 proc에는 테이블의 모든 레코드를 처리하는 루프가 포함될 수 있습니다. John Weldon이 제안한대로 sp_start_job을 사용하여 필요할 때 proc을 예약하거나 호출 할 수 있습니다. 다음과 같이

그런 상태를 조회 할 수있다 :

SELECT COUNT(NULLIF(Status, 0))/COUNT(*) as PctComplete --in progress or complete div by total 
FROM AsynchQueue WITH NOLOCK 
WHERE BatchID = @yourBatchId 

그 쿼리가 당신에게 당신의 배치의 완료율을 줄 것이다.

관련 문제