복붙노트

[SQL] SQL Server의 다른 테이블에 큰 테이블에 데이터를 복사하는 방법

SQL

SQL Server의 다른 테이블에 큰 테이블에 데이터를 복사하는 방법

나는 340 만 개 행이있는 테이블이있다. 나는 다른 테이블에이 모든 데이터를 복사합니다.

나는 아래의 쿼리를 사용하여이 작업을 수행하고 있습니다 :

select * 
into new_items 
from productDB.dbo.items

나는이 작업을 할 수있는 최상의 방법을 알 필요가있다.

해결법

  1. ==============================

    1.새 테이블로 복사하는 경우, 가장 빠른 방법은 행이 매우 큰 경우가 아니면, 귀하의 질문에 무엇을 아마입니다.

    새 테이블로 복사하는 경우, 가장 빠른 방법은 행이 매우 큰 경우가 아니면, 귀하의 질문에 무엇을 아마입니다.

    당신의 행이 매우 큰 경우에, 당신은 SQL Server의 대량 삽입 기능을 사용할 수 있습니다. 난 당신이 C의 #에서 호출 수 있다고 생각합니다.

    또는 당신은 먼저, 텍스트 파일로 대량 복사 (BCP)을 해당 데이터를 다운로드 할 수 있습니다. 이렇게하면, 인덱스 등의 키를 무시할 수의 추가 이득이있다

    또한 SQL Management Studio를 함께 제공되는 가져 오기 / 내보내기 유틸리티를 시도; 확실하지가 직선 대량 복사 한 빨리 될 것이다, 그러나 당신이 플랫 파일로 작성하는의 중간 단계를 생략 할 수 있도록하고, 조금보다 더 빨리 될 수있는 테이블에 테이블을 직접 복사해야하는지 여부 당신의 SELECT INTO 문.

  2. ==============================

    2.내가 20 억 행 테이블을 제외하고 내가 이런 짓을하는 경우 로그 파일도 대량 로깅에 대한 복구 모델 세트, 끝이 성장할 것이다, 그래서 나는 같은 문제가 있었다 :

    내가 20 억 행 테이블을 제외하고 내가 이런 짓을하는 경우 로그 파일도 대량 로깅에 대한 복구 모델 세트, 끝이 성장할 것이다, 그래서 나는 같은 문제가 있었다 :

    insert into newtable select * from oldtable
    

    그래서 데이터 블록에서 작동합니다. 전송이 중단 된 경우이 방법은, 당신은 단지 그것을 다시 시작합니다. 또한, 테이블과 큰 같은 로그 파일이 필요하지 않습니다. 또한 적은 tempdb를 얻을 것으로 보인다 I / O, 확실하지 왜.

    set identity_insert newtable on
    DECLARE @StartID bigint, @LastID bigint, @EndID bigint
    select @StartID = isNull(max(id),0) + 1
    from newtable
    
    select @LastID = max(ID)
    from oldtable
    
    while @StartID < @LastID
    begin
        set @EndID = @StartID + 1000000
    
        insert into newtable (FIELDS,GO,HERE)
        select FIELDS,GO,HERE from oldtable (NOLOCK)
        where id BETWEEN @StartID AND @EndId
    
        set @StartID = @EndID + 1
    end
    set identity_insert newtable off
    go
    

    테이블은 ID에 의해 클러스터 경우 당신은 당신이 ID를 처리하는 방법을 변경해야 할 수도 있습니다, 이것은 최선을 작동합니다.

  3. ==============================

    3.나는 다른 데이터베이스에 240M 행으로 감사 테이블을 복사하는 우리의 DBA로 일하고있다.

    나는 다른 데이터베이스에 240M 행으로 감사 테이블을 복사하는 우리의 DBA로 일하고있다.

    간단한 선택 사용 / 삽입 거대한 임시 데이터베이스 파일을 만들었습니다.

    a를 가져 오기 / 내보내기를 사용하여 일을하지만, 10 분에 8M 행을 복사 마법사

    사용자 정의 SSIS 패키지를 생성 및 조정 설정은 10 분에서 30M 행을 복사

    SSIS 패키지는 우리의 목적을 위해 가장 빠르고 효율적으로 밝혀졌다

    백작

  4. ==============================

    4.여기에 대형 테이블을 전송하는 또 다른 방법입니다. 난 그냥이를 사용하여 두 서버간에 105000000 행을 전송했습니다. 아주 빠른 너무.

    여기에 대형 테이블을 전송하는 또 다른 방법입니다. 난 그냥이를 사용하여 두 서버간에 105000000 행을 전송했습니다. 아주 빠른 너무.

    자세한 내용은 https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/ 참조

  5. ==============================

    5.그것은 1 시간 가져 오기의 경우 SSMS에서 가져 오기 / 내보내기 유틸리티는 아마도 가장 쉽고 빠른 작동합니다. SSIS는 직선 INSERT보다 큰 데이터 세트를 가져 오기위한 더 나은 작동하는 것 같다.

    그것은 1 시간 가져 오기의 경우 SSMS에서 가져 오기 / 내보내기 유틸리티는 아마도 가장 쉽고 빠른 작동합니다. SSIS는 직선 INSERT보다 큰 데이터 세트를 가져 오기위한 더 나은 작동하는 것 같다.

    BULK INSERT 또는 BCP는 대형 레코드 세트를 가져올 수 있습니다.

    또 다른 옵션은 일시적으로 가져 오는 테이블의 모든 인덱스와 제약 조건을 제거하고 다시 가져 오기 프로세스를 완료 한 번에 추가하는 것입니다. 이전에 이러한 경우에 힘 작업을 실패 직선 INSERT.

    가에 프로세스를 잠금 및 차단의 효과를 최소화 당신이 / 시간 초과 또는 잠금 처리 한 데이터베이스에서 다른 데이터베이스로 직접 갈 때 문제를 차단하는 경우 TEMPDB에 일dB에서 진행하는 것이 좋습니다 다음 다른 데이터베이스에 TEMPDB에서 진행 양쪽. 임시 데이터베이스는 차단하거나 소스를 잠그고 그 대상을 개최하지 않을 것입니다.

    사람들은 시도 할 수있는 몇 가지 옵션이 있습니다.

    -Eric 이삭

  6. ==============================

    6.행 개수까지 간단한 삽입 / 선택 특검팀의 작업 위대한 1 만 달러를 초과합니다. 나는 임시 데이터베이스 파일을 삽입 / 20 달러 + 행을 선택하려고 폭발 봤다. 가장 간단한 해결책은 SSIS 일괄 행 크기가 5000로 버퍼 (1000)에 버퍼 크기를 설정하는 투입된다.

    행 개수까지 간단한 삽입 / 선택 특검팀의 작업 위대한 1 만 달러를 초과합니다. 나는 임시 데이터베이스 파일을 삽입 / 20 달러 + 행을 선택하려고 폭발 봤다. 가장 간단한 해결책은 SSIS 일괄 행 크기가 5000로 버퍼 (1000)에 버퍼 크기를 설정하는 투입된다.

  7. ==============================

    7.당신의 초점이 보관 (DW)이며, 100 개 + 분할 된 테이블과 VLDB 다루고있는 당신은 비 프로덕션 서버 (OLTP) 여기에 이러한 리소스를 많이 사용 대부분의 작업을 분리 할 경우 제안입니다 (OLTP -> DW) 1)을 사용하여 백업 /)는 단계 및 대상 데이터베이스가됩니다 보관 또는 DW에, 이제 (아카이브 서버에 데이터를 얻을 복원 2) 단계 데이터베이스 : 해당 단계의 테이블 이동 데이터를 사용하여 파티션 스위치 각각의 양측에 표 단계적 3) 데이터를 전송하는 데 사용 SSIS 대상 데이터베이스에 데이터베이스로부터 단계적 4) 대상 데이터베이스 : 기본 테이블 단계에서 데이터 이동에 대상 데이터베이스에 대한 사용 파티션 스위치 도움이 되었기를 바랍니다.

    당신의 초점이 보관 (DW)이며, 100 개 + 분할 된 테이블과 VLDB 다루고있는 당신은 비 프로덕션 서버 (OLTP) 여기에 이러한 리소스를 많이 사용 대부분의 작업을 분리 할 경우 제안입니다 (OLTP -> DW) 1)을 사용하여 백업 /)는 단계 및 대상 데이터베이스가됩니다 보관 또는 DW에, 이제 (아카이브 서버에 데이터를 얻을 복원 2) 단계 데이터베이스 : 해당 단계의 테이블 이동 데이터를 사용하여 파티션 스위치 각각의 양측에 표 단계적 3) 데이터를 전송하는 데 사용 SSIS 대상 데이터베이스에 데이터베이스로부터 단계적 4) 대상 데이터베이스 : 기본 테이블 단계에서 데이터 이동에 대상 데이터베이스에 대한 사용 파티션 스위치 도움이 되었기를 바랍니다.

  8. ==============================

    8.그건 꽤 많이입니다. 이 할 수있는 가장 효율적인 방법입니다.

    그건 꽤 많이입니다. 이 할 수있는 가장 효율적인 방법입니다.

  9. from https://stackoverflow.com/questions/5296106/how-to-copy-a-huge-table-data-into-another-table-in-sql-server by cc-by-sa and MIT license