2010-11-25 1 views
1

250 만 개의 행을 포함하는 테이블이 있으며 각 행에는 xml 유형의 열이 하나 있습니다. 메시지가 다른 큐 (triggerqueue)에 도착하면 모든 레코드를 삭제하고 sqlserver 서비스 브로커 큐에 대기열에 포함해야합니다. 성능은 매우 중요하며 이제는 너무 느립니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?대형 테이블에서 ssb 대기열의 각 행을 큐에 넣습니다.

begin transaction 
delete top (1) from table output @tempTable 
select top 1 @message = message from @tempTable 
send on conversation @message 
commit transaction 

이 문제를 해결하기 위해 빠른 방법이 있습니다 :

현재 우리는 (@message <> 널) 루프 한 동안 수행하는 triggerqueue에 활성화 된 SP를 사용합니까? 그런데

: 누군가가 요청하기 전에 :이 이전 계산 병합 문의 출력으로 가득하기 때문에 우리는 테이블에서 시작해야

답변

0

그래서 성능 문제는 송신 측이 아닌 수신 측 , 권리? (귀하의 질문에서 약간 불분명 함). 이 경우 다음을 시도해 보는 것이 좋습니다.

  1. 단일 트랜잭션에서 많은 작업을 일괄 처리합니다. 커밋 할 때 동기식 로그 플러시에 가장 많이 부딪 힐 가능성이 큽니다.
  2. , 당신은 수신 측에 문제가있는 경우

를 (예 : 임시 테이블에 한 번에 더 많은 행을 선택하고 다음을 반복 커서를 사용하여 메시지를 보낼 수)보다 효율적으로 테이블을 처리하십시오 이 great article by Remus을 살펴보십시오.

관련 문제