sql-server - 오류 - sql server management studio 사용법




SQL Server 2008에 매우 빠르게 삽입하는 방법 (5)

필자는 장치의 데이터를 SQL 테이블에 직접 기록하는 프로젝트가 있습니다.

나는 SQL 서버 (2008 Express에서 작성)에 작성하기 전에 코드에서 처리하는 것이 거의 없습니다.

일반적으로 sqlhelper 클래스의 ExecuteNonQuery 메서드를 사용하고 SP가 예상하는 매개 변수 목록과 저장된 proc 이름을 전달합니다.

이것은 매우 편리하지만,이 작업을 수행하는 훨씬 더 빠른 방법이 필요합니다.

감사.


.NET에서 의미하는 경우 SqlBulkCopy 를 사용하십시오.


ExecuteNonQuery를 INSERT 문 또는 저장 프로 시저로 사용하면 Express에서 초당 수천 회의 삽입 범위로 이동할 수 있습니다. 4000-5000 / 초는 쉽게 달성 할 수 있습니다. 사실을 알고 있습니다.

일반적으로 개별 업데이트 속도가 느려지므로 로그 플러시 대기 시간이 필요하므로이를 고려해야합니다. 가장 쉬운 해결책은 일괄 커밋을하는 것입니다. 예 : 매 1000 삽입마다, 또는 매초마다 커밋하십시오. 이렇게하면 로그 페이지가 채워지고 트랜잭션의 모든 삽입에 대해 로그 플러시 대기 비용이 상각됩니다.

일괄 커밋을 사용하면 디스크 로그 쓰기 성능에 병목 현상이 발생할 수 있습니다. 하드웨어 성능을 바꾸지 않는 한 아무 것도 할 수 없습니다 (로그에 RAID 0 스트라이프가 발생 함).

이전 병목 현상이 발생 했을 가능성이 낮 으면 일괄 처리 문을 볼 수 있습니다. 여러 개의 삽입이있는 단일 T-SQL 일괄 처리를 보냅니다. 그러나 이것은 드물다.

물론 최소한의 열 크기로 테이블의 너비를 줄이고 클러스터되지 않은 인덱스를 제거하고 불필요한 제약 조건을 제거하는 등 쓰기 크기를 최소한으로 줄여야합니다. 가능한 경우 힙 삽입은 클러스터 된 인덱스보다 훨씬 빠르기 때문에 클러스터 된 인덱스 대신 힙을 사용하십시오.

빠른 삽입 인터페이스 (예 : SqlBulkCopy)를 사용할 필요가 거의 없습니다. 일괄 처리 커밋에 일반 INSERT 및 ExecuteNoQuery를 사용하면 일괄 삽입을 배포 할 필요성보다 훨씬 빠르게 드라이브 순차 쓰기 처리량을 소모하게됩니다. 대량의 인서트는 고속의 SAN 연결 기계에 필요하며 익스프레스를 언급하므로 아마 그렇지 않을 것입니다. 반대쪽에 대한 인식이 있지만 사람들이 일괄 삽입은 일괄 커밋을 제공하고 일괄 커밋은 일괄 처리가 아니라 일괄 처리가 생각한다는 것을 깨닫지 못하기 때문입니다.

성능 테스트에서와 마찬가지로 임의성을 제거 하고 데이터베이스와 로그를 미리 할당하고 테스트 측정 중에 또는 생산 중에 DB 또는 로그 증가 이벤트를 원하지 않으면 즉흥적입니다.


다음은 테이블 변수를 사용하여 많은 레코드를 삽입하는 좋은 방법입니다 ...

...하지만 테이블 변수가 "메모리"에 있기 때문에 한 번에 1000 개의 레코드로 제한하는 것이 가장 좋습니다.

이 예에서는 3 개의 필드가있는 테이블에 2 개의 레코드를 삽입합니다. - CustID, Firstname, Lastname

--first create an In-Memory table variable with same structure
--you could also use a temporary table, but it would be slower

declare @MyTblVar table (CustID int, FName nvarchar(50), LName nvarchar(50))

insert into @MyTblVar values (100,'Joe','Bloggs')

insert into @MyTblVar values (101,'Mary','Smith')

Insert into MyCustomerTable

Select * from @MyTblVar

벌크 삽입은 최소로 기록되기 때문에 가장 빠릅니다.

.NET에는 SqlBulkCopy 클래스 도 있습니다.


이것은 일반적으로 BULK INSERT 를 통해 수행됩니다. 기본적으로 파일을 준비한 다음 BULK INSERT 문을 실행하면 SQL Server는 파일의 모든 데이터를 빠른 방법으로 테이블에 복사합니다.

일부 제한 사항이 있습니다 (예 : 업데이트 할 행이있을 수있는 경우 "업데이트 또는 삽입"유형의 동작을 수행 할 수있는 방법이 없습니다).하지만 주위를 둘러 볼 수 있다면 많은 것을 찾을 수 없을 것입니다 빠릅니다.







performance