2008-10-08 4 views
3

마이그레이션 프로젝트의 일부로 일련의 쿼리를 실행하려고합니다. 생성 될 스크립트는 레거시 데이터베이스를 분석 한 도구에서 생성 된 다음 이전 엔티티 각각을 적합한 새 레코드에 매핑하는 스크립트를 생성합니다. 스크립트는 소규모 엔티티에서 잘 실행되지만 일부 스크립트는 약 80MB의 스크립트 파일을 생성하는 수십만 개의 레코드를 가지고 있습니다.큰 SQL Server 배치 삽입을 처리하는 방법은 무엇입니까?

이 스크립트를 실행하는 가장 좋은 방법은 무엇입니까?

큰 스크립트를 처리하는 프롬프트에서 일부 SQLCMD가 있습니까?

스크립트를 더 작은 스크립트로 나눌 수도 있지만 마이그레이션을 수행하기 위해 수백 개의 스크립트를 실행하고 싶지는 않습니다.

답변

2

가능한 경우 내보내기 도구가 BULK INSERT 호환 파일을 내보내도록 수정되었습니다.

예외가 없다면 삽입 문을 BULK INSERT가 허용하는 것으로 구문 분석하는 프로그램을 작성할 수 있습니다.

0

각 행에 대해 하나의 INSERT을 생성하는 것처럼 들리 겠지만 실제로 느릴 것입니다. 그것도 모두 트랜잭션으로 래핑 된 경우 다소 느릴 수 있습니다 (행 수가 커서 트랜잭션 수를 거의 불가능하게 만들지는 못하지만 - 마치 수백만 행을 보유하고있는 것처럼 트랜잭션에 삽입).

각 삽입을 스크립팅하는 대신 데이터를 마이그레이션하려면 ETL (DTS, SSIS, BCP 또는 BULK INSERT FROM 또는 기타 도구)을 보는 것이 좋습니다.

스크립트를 분해하여 실행할 수 있습니다 (특히 현재 모든 스크립트를 하나의 큰 트랜잭션으로 만드는 경우). PowerShell 또는 이와 유사한 도구를 사용하여 개별 스크립트의 실행을 자동화하십시오.

0

스크립트를 실행하기 만하면됩니다. 우리는 정기적으로 크기가 100의 Mb 인 백업/복원 스크립트를 실행합니다. 30 초 정도 밖에 걸리지 않습니다.

이 기간 동안 서버를 차단하지 않는 것이 중요 할 경우, 실제로는이를 분할해야합니다.

mysqldump의 -tab 옵션을 살펴보면 TO OUTFILE을 사용하여 데이터를 출력하므로 더 효율적이고 빠르게로드 할 수 있습니다.

0

파일에서 "BULK INSERT"옵션을 찾고 있었지만 파일 형식의 예는 볼 수 없습니다. 파일이 행 형식을 혼합 할 수 있습니까? 아니면 항상 CSV 형식으로 일관되어야합니까? 내가 묻는 이유는 다양한 부모/자식 테이블에 ID가 관련되어있어 행당 삽입 수가 현재 사용되는 이유입니다.

1

BULK INSERTBCP format files which come in traditional (non-XML) or XML을 사용합니다. 새 신원을 얻어야하고 어린이에게 사용해야하며 데이터베이스 디자인이 많이 바뀌었기 때문에 SET IDENTITY INSERT ON을 사용하여 도망 갈 수는 없습니까? 그렇다면 SSIS 또는 이와 유사한 방법을 사용하는 것이 더 좋을 수도 있고 일단 ID가 할당되면 병합 조인을 수행하는 것이 좋습니다. SSIS 또는 BCP를 사용하여 SQL의 스테이징 테이블에 데이터를로드 한 다음 일반 SQL (잠재적으로 SQL 작업의 SSIS 내) with the OUTPUT INTO feature to capture the identities and use them in the children을 사용할 수도 있습니다.

관련 문제