이론적 목적으로 만 구축 된 데이터 전송 상황을위한 도구는 SQL 서버 (2000 이상) 및/또는 Oracle (10g 이상) 인스턴스에서 다른 양의 데이터를 다른 (SQL> SQL, SQL> Oracle, Oracle> SQL 및 Oracle> Oracle로 전송하는 데 유용 할 수 있습니다.
SQL Server 및/또는 Oracle 테이블을 한 인스턴스에서 다른 인스턴스로 복사하는 것이 일반적입니다.
일반적으로 우리는 SSMS 가져 오기/내보내기 마법사, 통합 서비스 패키지 또는 데이터를 텍스트 파일로 전송하는 메소드를 사용하기로 결정했을 것입니다.
그러나 최소 시간 내에 복사 해야하는 경우 3 억 개 이상의 기록 또는 30GB 이상의 테이블에 대해 이야기하는 경우 문제가 발생할 수 있습니다.
운이 좋으면이 테이블은 SQL Server에 클러스터 된 인덱스가 있거나 Oracle의 주파수 히스토그램이있는 인덱스가있을 수 있습니다. 이것이이 작은 프로젝트가 역할을하는 시나리오입니다.
소스 테이블에 클러스터 인덱스가 없으면 희망이 있습니다. Oracle과 SQL Server 모두에서 힙 테이블에서 데이터를 복사하기위한 새로운 방법 (클러스터 된 것보다 약간 느리지 만 좋은 방법)을 구현했습니다.
그것의 논리는 매우 간단합니다. SQL Server에서 클러스터 된 인덱스 법령을 스캔하거나 Oracle의 히스토그램을 스캔하고 균형 잡힌 데이터 클러스터를 정의합니다.
이는 스레드가 매개 변수화 된만큼 많은 쿼리를 생성하고 클러스터 된 인덱스 필드의 쿼리 필터가 각각 동일한 볼륨의 데이터를 얻기 위해 시도합니다. 그런 다음 ODP.NET 메소드에서 SQLBULKCOPY .NET FW 또는 OracleBulkCopy를 사용하여 발사합니다. 힙으로, 결정적인 함수와 모듈 (SQL Server의 %% Lockres %% 및 Oracle의 Rowid)이있는 테이블을 "파티션"하고 각 쿼리를 하나의 스레드로 시작합니다.
우리는 스레드의 양에 따라 매우 자원 집약적 프로세스이며 경우에 따라 CPU 소비가 최대 100% 상승하고 디스크 대기열 길이가 긴 대기를 유발할 수 있다고 조언해야합니다.
이 때문에 데이터 소스 및 대상 이외의 다른 서버에서 실행하는 것이 좋습니다.
따라서 각 서버에 2 개의 100mbit 네트워크 카드가있는 2 개의 네트워크 구조로 190MB/SEG 전송 속도를 달성했습니다.
생산 환경에서 사용하기 전에 통계적 목적으로 테스트해야합니다.
추가 참고 사항 : 성능 게인은 특정 회계에서 달성되며 때로는 클러스터 된 열 내부의 데이터의 특성으로 인해 인식되지 않습니다. 우선 클러스터 된 인덱스가 복합 인덱스의 첫 번째 열의 통계 정보 만 저장한다는 것을 명확히해야하므로 클러스터 된 인덱스가 잘 설계되는 것이 더 중요해졌습니다. 우리는 가장 과립력을 가진 필드에서 주문 필드의 끝을 따라가는 것이 더 낫다는 것을 의미합니다. 발생할 수있는 또 다른 문제는 NULL 데이터의 양입니다. 통계는 NULL 데이터에 대한 이야기를하므로 테이블에 80%의 NULL 데이터가있는 경우 모든 NULL 데이터가 하나의 스레드로 고유 한 배치로 복사되므로 이점이 없습니다. 당연히 대상 테이블에는 인덱스가없고 (다중 벌크 삽입 스레드를 허용하기 위해) 파티션이없고 삽입 프로세스 속도를 높이기 위해 압축되지 않도록 권장합니다.
이 DLL은 SSIS 플랫폼에 의존하지 않거나 구축되지 않은 다른 ETL 프로젝트에 횡령 할 수 있습니다.