플랫 파일에서 수백만 개의 레코드를 SQL Server에 삽입하는 함정은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/141556

문제

파이프 구분이 있고 약 230MB 크기의 TXT 파일을 열 수있는 Windows Forms 애플리케이션을 작성하는 여행을 시작하려고합니다. 그런 다음이 앱은이 데이터를 SQL Server 2005 데이터베이스에 삽입합니다 (분명히 신속하게 발생해야 함). 이 프로젝트에는 C# 3.0 및 .NET 3.5를 사용하고 있습니다.

나는 앱을 요구하는 것이 아니라, 여기에 공동의 조언을하고 잠재적 인 함정이 조언합니다. 내가 수집 한 사이트에서 SQL Bulk Copy는 전제 조건이며, 내가 생각해야 할 것이 있습니까?

감사합니다. 누군가가 필요한 경우 명확성을 위해 질문을 편집하겠습니다.

도움이 되었습니까?

해결책

Winforms 앱을 작성해야합니까? SSI를 사용하는 것이 훨씬 쉽고 빠를 수 있습니다. 특히 일부 내장 작업이 있습니다 대량 삽입 작업.

또한 확인할 가치가 있습니다 플랫 파일 대량 가져 오기 방법 SQL Server 2005의 속도 비교.

업데이트 : SSIS를 처음 사용하는 경우이 사이트 중 일부를 확인하여 빠른 트랙을 시작하십시오. 1) SSIS 제어 흐름 기본 사항 2) SQL Server 통합 서비스를 시작합니다

이것은 또 다른 방법입니다 Excel 파일 가져 오기 SQL 2005.

다른 팁

이것은 스트리밍 노력이 될 것입니다.

가능하다면 여기에서 거래를 사용하지 마십시오. 거래 비용은 단순히 너무 커질 것입니다.

그래서 당신이 할 일은 한 번에 한 줄 씩 파일을 읽고 한 번에 한 줄에 삽입하는 것입니다. 실패한 인서트를 다른 파일에 버려야하고 나중에 진단하고 실패한 위치를 확인할 수 있습니다.

처음에는 스트리밍이 제대로 작동하는 것을 확인하기 위해 수백 행의 벌크 삽입을 시도한 다음 원하는 모든 것을 열 수 있습니다.

당신은 사용해 볼 수 있습니다 sqlbulkcopy. "모든 데이터 소스"에서 가져올 수 있습니다.

부수적 인 것처럼, 때로는 테이블의 지수를 떨어 뜨리고 벌크 삽입 작업 후에 재현하는 것이 더 빠릅니다.

전체 복구에서 벌크 로그로 전환하는 것을 고려할 수 있습니다. 이것은 백업을 합리적인 크기로 유지하는 데 도움이됩니다.

나는 SSIS를 완전히 추천합니다. 수백만 레코드를 읽고 비교적 적은 시간에 따라 청소할 수 있습니다.

SSIS를 잡기 위해 시간을 따로 설정해야하지만 돈을 지불해야합니다. 여기에는 몇 가지 다른 스레드가있어 유용 할 것입니다.

SQL Server (C# Client)에 많은 데이터를 삽입하는 가장 빠른 방법은 무엇입니까?

SSI에 권장되는 학습 자료는 무엇입니까?

C#에서 패키지를 만들 수도 있습니다. 레거시 시스템에서 3GL "마스터 파일"을 읽는 C# 프로그램이 있습니다 (관련 프로젝트에 API를 사용하여 객체 모델로 구문 분석) 패키지 템플릿을 가져 와서 ETL 용 패키지를 생성하도록 수정합니다.

당신이 말하는 데이터의 크기는 실제로 그렇게 거대하지 않습니다. 효율성 문제가 무엇인지 모르겠지만, 삽입하기 위해 몇 시간을 기다릴 수 있다면, 각 행을 한 번에 하나씩 하나씩 삽입하는 정말 순진한 기술로 이것이 얼마나 쉬운 지 놀랄 것입니다. . 한 번에 천 정도의 행을 함께 배치하여 SQL Server에 제출하면 상당히 빠르게 만들 수 있습니다.

상상할 수있는 속도가 빠르지 않으면 심각한 프로그래밍 시간을 절약 할 수있는 제안입니다. 이 가져 오기가 얼마나 자주 실행되는지에 따라 며칠의 프로그래밍 시간을 절약하는 것은 몇 시간 동안 달리는 동안 대가로 쉽게 가치가있을 수 있습니다.

You could use SSIS for the read & insert, but call it as a package from your WinForms app. Then you could pass in things like source, destination, connection strings etc as parameter/configurations.

HowTo: http://msdn.microsoft.com/en-us/library/aa337077.aspx

You can set up transforms and error handling inside SSIS and even create logical branching based on input parameters.

If the column format of the file matches the target table where the data needs to end up, I prefer using the command line utility bcp to load the data file. It's blazingly fast and you can specify and error file for any "odd" records that fail to be inserted.

Your app could kick off the command if you need to store the command line parameters for it (server, database, username / password or trusted connection, table, error file etc.).

I like this method better than running a BULK INSERT SQL command because the data file isn't required to be on a system accessible by the database server. To use bulk insert you have to specify the path to the data file to load, so it must be a path visible and readable by the system user on the database server that is running the load. Too much hassle for me usually. :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top