SQL Server-기본 키없이 큰 테이블 내보내기


9

SQL Server와 MySQL 사이의 기본 키없이 큰 테이블 ~ 5 억 행을 동기화해야합니다. 테이블에는 클러스터 복합 비 고유 인덱스 만 있습니다.

서버간에 ODBC 연결이 있지만 ~ 8 백만 행을 가져 오는 데 약 45 분이 걸리므로 언제든지 중단이 발생할 수 있으므로 더 큰 단일 가져 오기는 불합리하다고 생각합니다. 기존 테이블 구조를 변경할 수 없으며 다른 테이블을 추가 할 수 있습니다. 추가로 읽은 후에는 오프셋 / 페치가 큰 테이블에 대한 옵션이 아닙니다. "고유 키가 없기 때문에 x와 ... 사이에 ...를 선택하십시오"옵션은 없습니다.

모든 행을 포함하는 테이블을 일괄 적으로 내보내려면 어떻게해야합니까? 내 문제는 클러스터 키가 고유하지 않기 때문에 실제 행이 연속 쿼리간에 동일한 순서를 보장하지 않고 모든 열이 너무 오래 걸리는 순서를 보장하지는 않는다는 것입니다. 그리고 ODBC 또는 CSV 파일을 통해 배치를 마이그레이션하는 방법은 무엇입니까?


이 작업이 반복됩니까 (보통 작동) 또는 한 번 작동합니까?
Bogdan Bogdanov

초기 내보내기는 한 번만 수행되며 새 레코드 또는 업데이트와 같은 동기화 변경은 반복적이어야합니다. CDC는 옵션이 아니지만 초기 마이그레이션 후 추가 조사를 수행합니다.
1

도움이 필요하다고 생각합니다. 전체 프로세스에 대해 더 자세히 설명해야합니다 (매우 복잡한 문제가있는 것 같습니다)
Bogdan Bogdanov

"클러스터 된 키가 고유하지 않기 때문에 실제 행이 연속 쿼리간에 동일한 순서를 갖도록 보장하지 않는 순서"에 유의하십시오. 행 순서가 유지되지 않기 때문에 (일부 시퀀스 데이터가없는 경우) 동일한 실제 행 순서를 얻는 데 의존 할 수 없습니다. 행 순서는 기본적으로 삽입 순서 나 인덱스 순서가 아니라 ORDER BY 절에 의해 정의됩니다 .
RLF

예, RLF, 동의합니다. 열은 모두 int, A, B, C, D, E입니다. 클러스터 된 키는 ABC에 있습니다. 조합 ABC는 고유하지 않으며 조합 ABCD도 아닙니다. 고유하지 않은 열을 "주문"하면 전체 테이블을 일괄 적으로 내보낼 수 있습니까? 그리고 스택 플랫폼 인 Bogdan Bodganov는 복잡한 문제를 권장하지 않으므로 문제를 해결하는 것이 좋습니다. 행을 잃지 않고 전체 테이블을 가능한 한 빨리 일괄 적으로 내보내는 방법은 무엇입니까?
아무도

답변:


0

소스 테이블에 대해 갱신 또는 h 제가 없다고 가정하면 다음을 시도 할 수 있습니다.
1. CTAS 구문을 사용하여 기존 테이블의 사본을 작성하십시오 (SQLServer의 경우 SELECT * into source_table_copy FROM source_table). 이러한 작업은 거대한 테이블에서도 매우 빠릅니다.
2. 새 레코드를 복사하는 after insert트리거를에 추가하십시오 . 3. 이제 때 모든 새 레코드 로 이동 뿐만 아니라, 당신은 일괄 적으로 MySQL의 복사 테이블에서 데이터를 이동할 수 있습니다. 예를 들어, 두 서버 사이에 링크가 있으면 TSQL 저장 프로 시저 본문 내에서 모든 것을 수행 할 수 있습니다. 예를 들어 새 서버로 최대 20 개의 레코드를 이동시키는 코드는 다음과 같습니다.source_tablesource_table_copy
source_tablesource_table_copy

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

CURSOR를 사용하여 데이터를 읽은 다음 with where current of절 을 삭제할 수도 있습니다 .

** source_table실제로 1 단계 에서 응용 프로그램이 데이터를 삽입하지 못하게해야합니다 . 절대적으로 불가능한 경우 after insert1 단계 직전에 추가되고 완료 된 직후 제거 되는 트리거를 사용하여 데이터를 다른 테이블에 복사 할 수 있습니다 나중에와 병합하십시오 source_table_copy.


해결책에 감사드립니다. 나는 정상적인 삽입물로 무언가를 시도하고있었습니다. CTAS 구문을 사용하여 속도가 향상되는지 확인합니다. 마음에 들지 않는 후속 질문 : "삽입 후 트리거"가 성능에 영향을 줍니까?
1

트리거 본문은 매우 간단하므로 (데이터를 다른 테이블에 삽입하기 만하면) 성능 영향이 최소화됩니다.
a1ex07
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.