2012-09-20 3 views
1

CSV 파일을 데이터베이스 테이블로 가져 오는 응용 프로그램을 만들었으며 SQL Server 데이터베이스의 테이블로 가져 오는 데 필요한 여러 CSV 파일이 있습니다.SQL Server 데이터 가져 오기 딜레마

마음에 몇 가지 접근법이 있지만 가장 실용적인지 확실하지 않습니다. 응용 프로그램은 사용자가 로컬 파일 시스템에서 가져올 파일을 선택하도록 요청한 다음 [Load Files] 버튼을 클릭하기 만하면됩니다. 이 파일에는 때때로 100,000 개 이상의 행이 포함될 수 있습니다.

위의 시나리오에서 더 좋은 점은 무엇입니까? 에

  1. 가져 오기 CSV 파일은 데이터베이스

    에 데이터 테이블을 밀어 대량 복사의 전통적인 방법을 사용하여 C# 및 오픈 소스 GenericParser를 사용하여 데이터 테이블 : 내 관심사는 사용자 PC 때의 변형입니다 100,000 개 이상의 행이있는 파일에 대해이 작업을 수행합니다. 이것이 처리에 어떤 영향을 줍니까? 아니면 프로그램을 중단 시키는가?

  2. 파일 이름과 경로가 필요한 대량 삽입을 사용하십시오. 이 옵션에 대한 제 관심사는 서버가 실제 파일을 서버에 배치하지 않고 대량 삽입 명령을 처리 할 수 ​​있는지 확실하지 않습니다. 파일 경로는 사용자 로컬 시스템과 관련됩니다. Bulk Insert를 사용한 유일한 경우는이 앱에서 불가능한 서버 자체에 로그온 한 경우입니다.

  3. Linq와 함께 할 수있는 방법이 있습니까? 내가 Linq에 익숙하지 않은 동안 그것을 성취 할 수는있다.

모든 의견에 감사드립니다. 나는 그것을 실제적으로 성취하는 방법을 확신 할 필요가 없다는 것을 안다.

감사

+0

대량 삽입의 경우 MySQL의 'LOAD DATA INFILE'명령에 --local 옵션이 있습니다 [http://dev.mysql.com/doc/refman/5.1/en/load- data.html) "--local 옵션을 사용하면 mysqlimport가 클라이언트 호스트에서 데이터 파일을 읽습니다." –

+0

@AdolfoPerez 팁 주셔서 감사합니다 ... MySQL은이 데이터로드 어플리케이션을 정복 할 다음 데이터베이스입니다. 다른 질문을 저축했습니다. :) – Encryption

답변

1

내 추천 .NET에서 SqlBulkCopy 클래스를 사용하는 것입니다. BULK INSERT 문에서 거의 빨리 행을 가져올 수 있지만 DataTable에 행을 채우고 SQL Server로 보낼 필요가 있습니다.

CSV 파일 임용을 위해 built-in cmdlet 인 C# 대신 PowerShell을 사용하는 것이 가장 좋습니다 (간단한 파일 가져 오기 프로그램의 경우 내 개인 즐겨 찾기). 꽤 멋진 재료.

+0

100,000-200,000 행이있을 때마다 SQLBulkCopy가 수행하는 작업 Powershell은이 응용 프로그램이 사용될 모든 컴퓨터에서 사용하지 못할 수 있습니다. 그것은 휴대용/경량 응용 프로그램입니다. – Encryption

+0

행은 중요하지 않습니다. 바이트가 중요합니다. 1 바이트 너비 인 1,000,000 개의 행은 1 메가 바이트의 100 개의 행이있는 테이블보다 가져 오는 데 시간이 훨씬 더 걸립니다. 이 유스 케이스에서는 SQLBulkCopy의 성능이 저에게 좋았습니다. 자세한 내용을 원하면 Alberto의 연구를 확인하십시오. http://sqlblog.com/blogs/alberto_ferrari/archive/2009/11/30/sqlbulkcopy-performance-analysis.aspx –

+0

Dave에게 조언을 주셔서 감사합니다. 잘 작동하고 성능이 허용되는 것으로 보입니다. 물론 주 응용 프로그램보다 별도의 스레드에서 대량 복사를 실행합니다. – Encryption

0

1) .Net의 로더 앱은 일반적으로 좋은 선택입니다. 100,000 개의 행은 실제로는 심한 작업 부하가 아니며, 특히 단순한로드의 경우에 그러합니다. 즉석에서 값을 검색하기 위해 여러 테이블 조인이 필요하다면 정말 큰 관심사가됩니다.

2) 물리적 파일 위치는 엄밀히 말해 성능상의 문제 일 뿐이지 만, 나는하지 않을 것입니다. 그것은 관리 두통을 소개합니다.

3) Linq에 대한 경험이 없으므로 말씀 드릴 수 없습니다.

보너스 대체 아이디어 : IIS가 어딘가에 있거나 DB 서버에서도 실행되고 있다면 DB에 대한 ODBC 연결이있는 CGI 스크립트 인 가벼운 단일 페이지 "webapp"를 사용할 수 있습니다. 사용자는 CSV를 "웹/CGI"업로드로 제공합니다. 이 방법으로 사용자 워크 스테이션에 설치할 유틸리티 응용 프로그램이 없습니다.

0

이 문제를 해결하기 위해, 당신은 두 가지 기본보기에에 볼 수 있습니다 : 데이터 이전 데이터베이스로의 삽입과

  1. 당신은 어떤 작업을해야합니까 (일부 sumarization, 보정, ...)? 그렇다면 여기보다 파일에서 객체 (각 행을 하나의 객체 인스턴스로)로 업로드하는 가장 좋은 방법입니다. 그리고 Linq와 함께 항목 목록으로 우아하게 이동할 수 있습니다.

  2. 파일에서 데이터베이스로만 행을 삽입하면됩니까? 이 경우 질문 2 번에 설명 된 절차를 사용하십시오.

조치를 취하기 전에 파일을 서버에 업로드하는 것이 좋습니다. 더 안전합니다.

+0

파일을 서버에 업로드하는 것은 옵션이 아닙니다. 이것은 특정 서버에 대한 사용자의 권한을 불필요하게 제공하지 않는 독립형 독립 솔루션이어야합니다. 업데이트해야하는 서버가 여러 개 있습니다. 파일 업로드에는 항상 도메인 권한이 필요하지 않을 수 있습니다. 그러나 데이터베이스 액세스는 결코 문제가되지 않습니다. – Encryption

관련 문제