>

PROD DB의 한 테이블에서 Archive DB의 테이블로 많은 양의 데이터를 삽입하려고합니다. 테이블은 동일한 스키마를 가지고 있으며 아카이브 테이블은 인덱스가 줄고 "ID 삽입"이 있습니다. Arh DB/테이블에 존재하지 않는 레코드 만 삽입해야합니다. SSIS 시퀀스 패키지에서 "SQL 작업 실행"을 사용하고 있으며 매우 느리게 작동합니다 (20000 삽입 배치 크기 사용). 10 분 동안 20000 개의 레코드를 삽입했습니다. 48000000 레코드를 삽입해야합니다. SQL Server는 2016 표준 EDT입니다. 이것에 대한 해결책이 있습니까?

SQL 쿼리는 다음과 같습니다 :

SELECT TOP (@InsertBatchSize) s.ID,.....and other columns 
FROM PRODDB.dbo.source_table AS s WITH (NOLOCK) 
    INNER JOIN ArchiveDB.dbo.MissingIDsTable AS t WITH (NOLOCK) 
    ON s.ID = t.ID 
WHERE s.ID not in (SELECT ID 
                   from ArchiveDB..destination_table 
                   WHERE IsUpdated is null )

  • 답변 # 1

    Execute SQL  데이터 전송에 적합하지 않습니다. 데이터를 일괄 처리하거나 변환 할 수 없습니다. 이것이 Dataflow 작업의 일입니다. 데이터 흐름 작업을 통해 Firehose 커서를 사용하여 소스 데이터를 읽고 최소한의 로깅을 사용하여 일괄 일괄 작업을 사용하여 데이터 대상에 데이터를 쓸 수 있습니다. 속도는 소스 쿼리에 따라 다릅니다. 쿼리 속도가 느리면 실행 속도가 느려집니다.

    이 문제는 소스 및 대상 데이터베이스의 테이블 스키마와 같은 많은 정보가 누락되었습니다. "Identity insert on" 에서  테이블에 소스의 IDENTITY 및 기본 키인 ID 열이 있다고 생각합니다. 새 레코드에만 관심이있는 경우 마지막 실행 이후 데이터 만 읽는 소스 쿼리를 작성할 수 있습니다. 예 :

    SELECT s.ID,.....and other columns 
    FROM PRODDB.dbo.source_table AS s
    where ID>@maxId
    
    

    와이즈 비즈  소스 쿼리에 제공된 쿼리 매개 변수입니다. 일괄 처리가 필요하지 않습니다. SSIS는 데이터 소스, 일괄 처리 크기의 대상 설정 등을 기반으로이를 수행 할 수 있습니다.

    이 쿼리는new데이터를로드 할 때만 사용해야합니다. 초기 복사본을 만들려면 소스 쿼리가 필터링하지 않는 다른 데이터 흐름을 사용하십시오. @maxId 와 같은 것을 사용  전체 인덱스를 스캔 한 후에 만 ​​모든 데이터를 반환합니다. 이미 모든 데이터를 복사 할 때그것은 무엇입니까?

    ID는target테이블의 기본 키 여야합니다. 이것은 Where ID>-1 의 속도를 높일 것입니다  매개 변수 값을로드하는 작업입니다. 또한 불가피한 복제 오류를 감지하고 방지합니다. 아무리주의를 기울여도 다른 사람들은 항상 실수로 데이터가 중복 될 수 있습니다.

    삽입하기 전에 색인을 비활성화하고 가져 오기 작업 후에 색인을 다시 활성화하여 가져 오기 성능을 향상시킬 수 있습니다.

    변경 사항을 감지하고 데이터를 복사 할 수있는 유일한 방법입니다. 다른 기술은 소스 테이블에서 변경 내용 추적을 활성화하고 마지막 작업 실행 이후 수정 된 행을 검색하는 것입니다.

    수정 된 데이터를 준비 테이블로 복사하고 대상과해당변경 사항을 INSERT/UPDATE 변경에 조인 할 수도 있습니다. ID 또는 변경 내용 추적을 사용하여 수정 된 데이터를 찾을 수 있습니다. 이렇게하면 소스를 빠르게 확보 할 수 있다는 이점이 있습니다.

  • 답변 # 2

    작업-데이터베이스 간 데이터 전송, 대상 DB는 SQL 2016 서버에 있습니다.
    다음과 같은 방법을 권장합니다.

    <올> 스테이징로드를 위해 ArchDB 테이블에서 작성하십시오. 관리 및 가독성을 위해 별도의 스키마에서 원본 테이블과 동일한 이름으로 생성하는 것이 좋습니다.

    다음 단계로 SSIS 패키지를 생성하십시오 :

    Exec SQL 작업에서 필요한 준비 테이블 정리

    데이터 흐름 태스크-모든 데이터를 소스에서 ArchDB의 스테이징 테이블로 이동하십시오. 데이터 플로우에서-ArchDB 대상 테이블을 기반으로 전체 캐시가있는 찾아보기 컴포넌트를 정의하십시오. 이 컴포넌트는 ArchDB에 존재하는 레코드를 검사합니다. 누락 된 레코드 만 가져옵니다.

    아치 DB의 스테이징 테이블에서 대상 테이블로 데이터 이동

    (TABLOCK) 선택으로 삽입 ... FROM

    의견 :

    DFT의 조회 구성 요소는 기존 레코드를 필터링하는 데 사용됩니다. ArchDB 대상 테이블에 인덱스가 없으므로 RAM 풋 프린트가 높은 전체 캐시를 사용해야합니다.

    select MAX(ID) from target  수축은 SQL 2016의 병렬 삽입 기능을 활용하는 데 사용됩니다.

    테이블을 준비하지 않고 대상 테이블에 바로 삽입 할 수 있습니다. 그러나 디버깅이 더 어려워집니다.

    INSERT WITH (TABLOCK)

  • 이전 javascript - 십진수 일 때 Ajax 메소드가 컨트롤러에 충돌하지 않음
  • 다음 ggplot2 - 아르 자형 - geom_line을 카테고리별로 점선/대시/판매합니다