아마도 모든 DBA 데이터 가져오기 시간, 짧은 작업 효율성, 그들의 힘을 증명 하기 위해 더 충분 한 도전 하 고 싶습니다. 실제 작업에서 때로는 데이터베이스에 많은 양의 데이터를 가져올 필요가 및 다음 각종 계산 프로그램,이 기사 추천 합니다 도전 4 초 수백만 수 있도록 제한 데이터를 SQL Server로 실험 케이스.
이 실험은이 과정과 소요 시간 다양 한 방법의 상세한 기록 완료 5 메서드를 사용 합니다. 사용 도구는 Visual Studio 2008 및 SQL Server 2000, SQL Server 2008, SQL Server 2000 및 SQL Server 2008로 1 백만 데이터를 가져오려면 5 메서드를 사용 하 여, 실험 환경 Dell 285 0 듀얼 2.0gcpu, 2 g 메모리 서버. 관심 있는 친구 들 소스 코드를 다운로드할 수 있습니다 스스로 확인 하는 시간을 보냈다.
좋아, 그래서 기본 INSERT 문을 사용 하 여, BULK INSERT 문을 사용 하 여, 대량 삽입을 사용 하 여 여러 스레드에서 SqlBulkCopy 클래스를 사용 하 여 그리고 SqlBulkCopy 클래스를 사용 하 여 여러 스레드에서 4-2 한계에 도전 하는 5 가지 방법. 또한이 실험에서 SQL 문의 실행만 하 고 SQL 구성을 캡슐화 하는 Isline에 대 한 최종 결과에 필수 영향을 미칠 하지 않습니다 Isline 프레임 워크 프레임 워크의 Dataprovider 모듈을 사용 하는 설명 하는 필요가 있다 프레임 워크 프레임 워크 프레임 워크 Isline 시리즈를 참조 하십시오.
데이터베이스 SQL Server 2000을 사용 하 여 SQL Server 2008, 테이블 이름 TableB, 필드 이름은 Value1, 데이터베이스 이름을 app.config에서 수정할 수 있습니다, 그리고 기본은 테스트.
방법 I. 사용 하 여 기본 삽입 문
이 방법은 대부분의 사람들이 처음에 생각 하는 가장 기본적인 방법입니다. 하지만 INSERT 문을 하지 않는 대량 작업에 적합 될 그것?
이 방법에서는, 1 백만 데이터 10 배치, 각 배치 100000, 데이터베이스를 가져오려면 100000, 및 10 시간 당 1 거래로 나누어져 있습니다.
→ 기본 문을:
값 ('+ i +'); TableB (Value1)에 삽입 설명: 문에서 나 데이터베이스 필드에 값을 채우는 호스트 프로그램에는 추가 변수입니다.
SQL Server 2000 시간이 소모: 901599
SQL Server 2008 시간이 소모: 497638
메서드 2. BULK INSERT 문을 사용 하 여
가장 만족 스러운 것이 실험에서이 클래스의 효과 라고 할 수 있다 가장 간단 하 고 유연한, 빨리의 그것의 사용.
"BULK INSERT" 문을 매우 일반적인 것 같지 않습니다 그리고 코스로 Oracle에는 Oracle 임시 테이블을 외부 파일에 매핑할 및 다음 직접 가져올 데이터 임시 테이블에서 Oracle은 매우 만족 하는 방법에서에서 다른 테이블에 길이 있다 sql 서버의 대량 삽입 동등 하 게 만족은?
→ 기본 문을:
대량 삽입 TableB에서 '
C:sql.txt '와 함께 (FieldTerminator = ',', rowter
/., mbminator = ' | ', batchsize = 100000)
설명: "C:sql.txt"은 이전에 생성 된 파일은 데이터의 100를 포함 하는 "|" 기호 구분 100000 데이터 당 하나의 트랜잭션.
SQL Server 2000 시간이 소요: 4009
SQL Server 2008 시간이 소요: 10722
방법 3. 여러 스레드에서 삽입 대량을 사용 하 여
메서드 2 개, 1 백만 데이터 5 개의 스레드를 나누어, 기초 각 스레드 200000 데이터, 모든 50000에 대 한 책임은 한 가지, 5 개의 스레드를 동시에 시작이이 효과 참조 하십시오.
SQL Server 2000 시간이 소요: 21099
SQL Server 2008 시간이 소요: 10997
방법 4. SqlBulkCopy 클래스를 사용 하 여
이 방법은 또한 빠른, 하지만 메모리의 수백만의 수만 복잡 한 데이터에 따라 또는 더 많은 필드는 메모리에 사용할 수 있습니다만 문제를 처리 하기 위해 64 비트 솔루션을 사용할 수 있습니다.
케이스의 수백만의 수만, 다중 필드 데이터는 등 글로벌 소비자에 대 한 비즈니스 사이클 소비를 컴퓨팅, 먼저 마스터 데이터베이스 테이블에서 회원 소비 레코드의 스냅샷을 얻는 다음 계산 프로그램에 의해 사용 되는 임시 테이블에는 스냅숏 저장 일부 비즈니스 시나리오에서 일반적으로 발생 한다. 그리고 가끔 데이터는 없는 데이터베이스 서버, 그러나 많은 국가에서 하나 이상의 서버에 그래서 우리는 메모리 또는 외장 스토리지 장비를 사용 하 여 데이터를 전송 하 고 청소를 하는 소비자의 소비자 병합, 감지, 마지막으로 사용 하는 계산 프로그램에 대 한 특별 한 테이블을 가져올.
기본 정책:
(System.Data.SqlClient.SqlBulkCopy SQLBC를 사용 하 여
새로운 System.Data.SqlClient.SqlBulkCopy (챔피언) =)
{sqlbc.batchsize = 100000; sqlbc.bulkcopytimeout
= 60; Sqlbc.destinationtablename = "dbo". TableB ";
SQLBC.COLUMNMAPPINGS.ADD ("하지", "값 1");
Sqlbc.writetoserver (DT); }
설명:
BatchSize = 100000; 모든 100000 거래 지시 및 제출
Bulkcopytimeout = 60; 60 초 타임 아웃에 의해 처리 됩니다 나타냅니다.
DestinationTableName = "dbo". TableB "; TableB 테이블로 데이터를 가져올 나타냅니다.
Columnmappings.add ("하지", "값 1"); 메모리에 하지 필드 값 1 필드 TableB에서 일치를 나타냅니다.
이후 WriteToServer (DT); 여기서 DT 하지 필드를 포함 하는 사전 구축 된 DataTable입니다.
SQL Server 2000 시간이 소요: 4989
SQL Server 2008 시간이 소요: 10412
방법 5. 여러 스레드에서 SqlBulkCopy 클래스를 사용 하 여
4, 1 백만 데이터 5 개의 스레드를 나누어 하는 방법에 따라, 각 스레드는 200000 데이터를 각 50, 000에 대 한 한 가지, 5 개의 스레드를 동시에 시작이이 효과 참조 하십시오.
SQL 2000 시간이 소요: 7682
SQL 2008 시간 소모: 10870
결과
마지막으로, 실험을 완료 하는 몇 일 더 실망은 SQL SERVER 2008 가져오기 데이터 성능 해야 하지 않는 만큼 좋은 우리가 생각 하는