2016-07-21 3 views
1

내 C# 응용 프로그램은 Sql Server에서 100 만 개가 넘는 레코드를 검색하고 처리 한 다음 데이터베이스를 다시 업데이트합니다. 이것은 가까운 10 만 업데이트 문에서 결과 그들은 모두 다음과 같은 형식이 -C# 및 SQL Server

update Table1 set Col1 = <some number> where Id in (n1, n2, n3....upto n200) 

는 "이드"를 int, 클러스터 된 인덱스와 기본 키입니다. 두 개의 업데이트 문은 동일한 ID를 업데이트하지 않으므로 이론적으로 잠금없이 모두 병렬로 실행할 수 있습니다. 그러므로, 이상적으로, 가능한 한 많이 병렬로 실행해야한다고 생각합니다. 모든 것이 5 분 안에 끝나기를 기대합니다.

이제 제 질문은 가장 효율적인 방법입니다. 나는 아래를 시도하고있다 -

  1. 순차적으로 순차적으로 실행 - 이것은 가장 효율적인 효율적인 솔루션이다. 1 시간이 걸립니다.
  2. 스레드에서 각 업데이트를 실행하여 병렬로 실행 - 다시 수천 개의 스레드를 생성하기 때문에 매우 비효율적이지만 어쨌든 시도 했으므로 한 시간 이상 걸렸으며 상당수가이 연결로 인해 실패했습니다 발행물.
  3. 새 테이블에 대량 삽입 한 다음 업데이트에 대한 조인을 수행합니다. 그러나 둘 이상의 사용자가이를 수행 할 것으로 예상되므로 동시성 문제가 발생합니다.
  4. 업데이트 대신 병합 병합 - Google은 병합이 실제로 개별 업데이트 문보다 느리기 때문에 시도하지 않았다고 말합니다.

대용량의 데이터를 처리하는 많은 응용 프로그램에서 매우 공통적 인 문제라고 생각합니다. 표준 솔루션이 있습니까? 어떤 아이디어 나 제안도 환영합니다.

+0

유용 할 수 있습니다. http://stackoverflow.com/questions/20635796/bulk-update-in-c-sharp – TheDude

+0

수천 개의 스레드를 만드는 대신 스레드 풀을 사용 해본 적이 있습니까? – itsme86

+1

일괄 요청을 실행하고 싶습니다. – TheDude

답변

0

나는 모든 ID를리스트로 sp에 전달할 수 있도록 정수 tbl 유형을 생성 한 다음 단일 쿼리가 전체 테이블을 업데이트합니다.

이 여전히 느린하지만 "ID가 (1,2,3)의 위치를"TYPE위한

정의

여기
CREATE TYPE [dbo].[integer_list_tbltype] AS TABLE(
    [n] [int] NOT NULL, 
    PRIMARY KEY CLUSTERED 
(
    [n] ASC 
)WITH (IGNORE_DUP_KEY = OFF) 
) 
GO 

는 인이 종래보다 훨씬 더 빠르다 참조 용법.

declare @intval integer_list_tbltype 
declare @colval int=10 

update c 
set [email protected] 
from @intval i 
join Table1 c on c.ID = i.n 

궁금한 점이 있으면 알려주세요.