2016-10-28 2 views
0

이상한 점이 있습니다 : BULK INSERT를 실행하여 거대한 텍스트 파일의 테이블에 2 천만 개 정도의 레코드를 추가 할 때 잠시 동안 실행 한 후 2,500,000 개의 행이 있습니다 ... 15 분 후에 다시 봅니다. 2,200,000 개의 행이 있습니다 ... 조금 후에 2,000,000 명이 있습니다. 어떻게 BULK INSERT 중에 레코드 수를 줄일 수 있습니까? 나는 디스크 가득한 경고 몇 개를 알아 차렸다. SQL Server는 드라이브가 꽉 차있을 때 어떻게 든 레코드 삭제를 시작합니까? 도움!SQL Server 레코드가 손실 되었습니까?

+0

쿼리 할 때마다 드라이브에 얼마나 많은 여유 공간이 있습니까? 또한, 추측의 무언가,하지만 당신이 기대할 수있는 일이'커밋 '되지 않는다고 생각하고 있습니다. [이 질문의 영감을 수 있습니다.] (http://stackoverflow.com/questions/41869/is-sql-server-bulk-insert-transactional) –

답변

0

나는 2 백만 레코드의 몇 배치에서 이것을 시도 할 것이고 어떤 일이 일어날지를 볼 것이다. 나는 Microsoft's documentation에서이 뽑아 :

성능 고려 페이지 수는 하나의 일괄 처리에서 플러시 내부 임계 값, 풀을 식별하는 데 발생할 수있는 버퍼의 전체 검사를 초과 할 경우

일괄 처리 이 커밋 할 때 플러시 할 페이지 이 전체 검사는 대량 가져 오기 성능을 저하시킬 수 있습니다. 대형 버퍼 풀이 저속 I/O 하위 시스템과 결합 될 때 내부 임계 값을 초과 할 가능성이 있습니다 ( ). 큰 컴퓨터에서 버퍼 오버플로를 피하려면 TABLOCK 힌트 ( 일괄 최적화 제거)를 사용하거나 작은 일괄 처리 크기 ( 일괄 최적화 유지)를 사용하지 마십시오. 컴퓨터가 다양하기 때문에 은 데이터로드가있는 다양한 배치 크기를 으로 테스트하는 것이 가장 좋습니다.

bcp utility을 사용하는 것이 좋습니다.

+0

안녕, dylpickle! 글쎄, 이것은 일반적으로 지금까지 OK, 항상 많은 레코드를 가지고 일하고있다. 디스크가 가득 차서 작동하는지 궁금합니다. 그러나 그것은 여전히 ​​대량 삽입물이 계속 실행되는 것처럼 레코드 수가 줄어들고있는 이유를 설명하지 않습니다 ... ???? !! –

+0

그래, 이상 하네. 나는 Bob Kaufman이 rollback 아이디어를 가지고 있을지도 모른다고 생각한다. 디스크 공간과 로그 크기는 진단하는데 도움이되는 정보가 부족합니다. – dylpickle

+0

SQL Server는 스레드 및 작업 목록을 사용합니다. 벌크 스레드가 일괄 적으로 대량의 삽입 작업을 처리/디스크에 기록한다고 가정 해 보겠습니다. 그런 다음 실제로 디스크에 쓰는 다른 스레드가 있는데, OS가 디스크에 직접 쓰는 것을 기다려야 만합니다. 그런 다음 작업을 수행하여 디스크에 씁니다. 작업에서 오류가 발생하면 오류가 발생하고 정리, 종료 및 다음 쓰기 창을 기다린 후 다음 배치로 반복합니다. 그것이 작업이 동기 상태로 계속 실행되는 방법입니다. 때로는 멈추지도 않고 멈추지도 않습니다. – Tschallacka

관련 문제