2011-12-14 1 views
0

MS SQL 데이터베이스 (서버가 아님)가 있습니다. 내 프로그램은 2TB 외장 드라이브의 파일 구조를 읽고 목록을 데이터베이스에 저장합니다. 나는 약 80k 기록을 매번 쓰고 그것은 좋은 시간이 걸린다.멀티 스레딩 SQL 클라이언트 쓰기 쿼리

현재 각각 2 개의 배경 작업자 스레드 40k로 나누어 기록합니다. 내 PC는 쿼드 코어 신동 II입니다.

이 작업을 수행하는 가장 좋은 방법은 무엇이며 또한 광산은 7200rpm hdd이며 습격하지 않기 때문에 스레드 수를 늘려서 어떤 이점도 얻을 수 있습니다. 내 말은 HDD가 한계 일 수 있다는 것입니까?

감사합니다.

편집 : 시간이 기록은 15-18 분 전입니다. 저장 프로 시저를 사용하지 않습니다. 자동 생성 된 테이블 어댑터에서만 insert 명령을 사용하고 있습니다. 각 스레드에 대해 40k 번 insert 문을 반복합니다. 아니요, 색인 된 파일을 기반으로 업데이트하지 않으며, 단지 삽입 문입니다.

답변

2

80k 레코드에는 많은 시간이 걸리지 않습니다. 당신은 "좋은 시간"이라고 말하지만 실제로는 무엇입니까? 상대 기간의 실제 시간을 알 수 없습니다.

1) 저장 프로 시저를 사용하고 있습니까? 2) 대량으로 처리 할 수있는 것이 있습니까 (BCP 또는 많은 삽입/업데이트 명령문이 생성되어 단일 명령으로 전송되는)? 3) WHERE 절의 색인 필드를 사용하는 모든 업데이트가 있습니까?

1)이 데이터베이스 모두와 당신이 작성하는 데이터를 수용 할 수 있도록 충분한 여유 공간보다 더 가지고 작성하는 데이터베이스에 대한 로그 파일을 확인합니다

+0

Hello Jared Peless, 질문에 정보를 추가했습니다. 편집. 시간 내 주셔서 감사합니다. – surpavan

+0

테이블 어댑터를 사용하는 경우 먼저 테이블이 완전히 채워 졌는지 확인한 다음 업데이트/삽입을 수행하면 성능이 향상됩니다. –

+0

삽입 만하면됩니다. 업데이트는 사용하지 않지만 스레드의 수를 늘리는 것과 같은 빠른 프로세스 예제를 만드는 방법은 무엇입니까? 최대 4 개의 스레드까지 시도했지만 2 개의 스레드보다 시간이 오래 걸립니다. 내 테스트에서 나는 2 스레드가 최적의 지점임을 발견했다. – surpavan

1

나는 몇 가지 제안 사항을 알려드립니다. 동적으로 데이터베이스의 크기를 조정하면 SQL Server에 매우 비용이 많이 드는 작업이며 크기가 작은 작은 데이터베이스로 시작하는 경우 계속 크기를 조정하게됩니다.

2) 삽입 명령을 트랜잭션으로 래핑하십시오. 이렇게하면 속도가 크게 향상됩니다. 단일 트랜잭션에서 80k 레코드를 모두 래핑 할 수는 없지만 한 번에 1000 개 정도를 시도 할 수는 있습니다. 의사 코드 :

Const MAX_RECORDS_PER_LOOP = 1000 
    Dim Counter As Integer 
    Dim trans As SqlTransaction 

    Try 
     For Each record In File 
      ' If we are not in a transaction, enter one 
      If trans Is Nothing Then 
       trans = conn.BeginTransaction() 
      End If 

      ' Do your insert 

      ' Boost the counter 
      Counter += 1 

      ' We have reached the max 
      If Counter = MAX_RECORDS_PER_LOOP Then 
       ' Commit the previous batch and reset the values 
       trans.Commit() 
       trans = Nothing 
       Counter = 0 
      End If 
     Next 

     ' Commit the last batch, if any 
     If trans IsNot Nothing Then 
      trans.Commit() 
     End If 

    Catch theException As Exception 
     ' Report the exception 
     ' Rollback if trans in progress 
     If trans IsNot Nothing Then 
      trans.Rollback() 
     End If 
    End Try