2013-09-06 5 views
0

우리는 300,000 개가 넘는 레코드가있는 테이블이 몇 개 있으며 한 테이블에서 다른 테이블로 레코드를 전송/복사하는 데 몇 시간이 걸립니다. 많은 양의 데이터를 다룰 때 커서를 사용하고 하나의 테이블에서 다른 테이블로 각 레코드를 하나씩 복사하는 것보다 효율적인 방법이 있습니까?대용량 데이터를 하나의 테이블에서 다른 테이블로 복사하는 더 효율적인 방법

코드 :

open SOMETBL 
fetch SOMETBL into @key1,@key2,@key3,@key4 
while(@@fetch_status = 0) 
begin 

    SELECT @key1InMapping = count(*) FROM SOMEOTHERDB.dbo.tblSOMETBLping WHERE fldEServicesKey = @key1 

    SELECT @eServiceTypeKey = fldAServiceTypeKey FROM SOMEOTHERDB.dbo.tblAServiceType WHERE fldAServiceTypeNumber = @key4 

if (@eServiceTypeKey=null or @eServiceTypeKey=0) 
      set @eServiceTypeKey = 50 

    if @key1InMapping>0 
    begin 
    update SOMEOTHERDB.dbo.tblSOMETBLping set [email protected] where fldEServicesKey= @key1 
    -- print 'post='+convert(varchar,@key2) + ' :key1='+convert(varchar,@key1)+ ' :serviceTypeKey='+convert(varchar,@eServiceTypeKey)+' : serviceTypeNum='+convert(varchar,@key4) 
    end 
    fetch SOMETBL into @key1,@key2,@key3,@key4 

end 

close SOMETBL 
+1

몇 시간이 걸리는 것은 커서입니다. 연속 SQL 쿼리는 300,000 개의 행만 복사하는 데 몇 초에서 몇 분이 걸립니다. – HardCode

+0

단일 데이터베이스에서 데이터 전송이 일어나고 있습니까 아니면 데이터베이스간에 데이터를 이동하고 있습니까? –

+0

@Declan_K 이것은 단일 데이터베이스에서 발생합니다. –

답변

4

30 만 기록을 데이터베이스 측면에서 소량의 데이터입니다. 그러나 실제로는 2 백 개가 넘는 레코드에 사용해서는 안되는 커서를 사용하는 데는 너무 커서 커밋 기반 코드를 작성하면 솔직히 커서가 작성되는 시간이 단축됩니다. 그래서 커서를 최우선 적으로 사용하지 않을 것입니다. 최후의 수단입니다. 한 번에 하나의 레코드를 커서에 삽입/업데이트하거나 삭제하는 것에 대해 생각하지 않아야합니다. 집합 기반 작업을 사용합니다. 이제 300,000 개의 레코드를 사용하면 커서가 아닌 한 번에 한 그룹당 레코드 (10,000 개)를 처리 할 때 세트 기반과 커서의 조합을 고려할 수 있습니다.

커서를 설정 기반 코드로 변경하는 방법에 대한 자세한 내용은 다음을 참조하십시오. http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

+0

응답 해 주셔서 감사합니다. 공유 한 링크를 검토하겠습니다. 문제를 겪은 후에 커서를 사용하는 것이 가장 먼저 사용해서는 안되지만 다른 솔루션을 사용할 수 있는지 충분히 알지 못했습니다. –

관련 문제