2010-05-10 5 views
3

DB (SQL Server)를 집중적으로 사용하는 응용 프로그램이 있습니다.최상의 성능으로 SQL 서버에 데이터 삽입

성능이 높아야하므로 실행 시간 관점에서 DB.Fastest에 레코드를 삽입하는 가장 빠른 방법을 알고 싶습니다.

무엇을 사용해야합니까?

가장 빠른 방법은 저장 프로 시저를 만들고 코드 (ADO.NET)에서 호출하는 것입니다. 더 나은 방법이 있는지 또는 성능을 향상시키는 다른 방법이 있는지 알려 주시기 바랍니다.

+1

자세히 설명해 주시겠습니까?얼마나 많은 인서트를 여기서 말하는거야? 성능이 중요한 이유는 무엇입니까? 팜에 몇 대의 서버가 있습니까? 어떤 종류의 디스크를 실행하고 있습니까? (당신의 이슈가 레코드를 삽입하는 가장 빠른 방법 인 것 같지 않기 때문에 하나의 SQL 서버와 단 두 개의 디스크 만 있다면 응답하지 마십시오. 물론 전에 틀 렸습니다.) – jcolebrand

+0

현재 2 개의 서버가 있습니다 G6 HP DL360 그들. 현재 그들은 RAID 작업을하고 있지만 다음 달에 SAN으로 옮길 계획입니다. 서비스에 대한 막대한 부담이 예상되고 응답 시간이 최소화되어야하기 때문에 성능은 정말로 중요합니다. – Incognito

답변

1

더 나은 방법이 있는지 또는 성능을 향상시키는 다른 방법이 있는지 알려 주시기 바랍니다.

  • 레코드 당 하나의 연결을 열지 마십시오. 연결 풀링이 실수로 레코드 당 하나의 연결을 열지 않게하는 방법을 배웁니다.
  • 가능하면 레코드 당 하나의 트랜잭션을 열지 마십시오. 또한 과도한 기간 동안 거래를 열어 두지 마십시오.
  • 테이블 디자인을 고려하십시오. 인덱스/제약 조건이 거의없고 트리거가없는 좁은 테이블.
  • 웹 응용 프로그램이므로 빠른 사용자 삽입이 필요하고 사용자에게 페이지를 반환해야하거나 winform 응용 프로그램이고 UI 스레드에서 블로킹하는 경우 비동기 삽입 또는 다른 스레드에서 수행하는 것을 고려하십시오 .
  • 백만 줄 파일을 가져 오기 위해 빠른 삽입이 필요한 경우 대량 삽입을 고려하십시오.
  • 데이터를 저장하고 쿼리하지 않으려면 파일 기반 솔루션을 사용하는 것이 좋습니다.
+0

연결 풀을 사용 중입니다. 리퀘 스터에게 보낸 응답이 레코드가 삽입되도록 보장되면 트랜잭션이 각 호출에 대해 열어야합니다. 테이블에 최소 인덱스와 트랜잭션이 없습니다. 이것은 TCP 서버이며 삽입은 스레드 풀에서 호출됩니다. 각 요청마다 삽입을 수행해야하므로 대량 삽입이 작동하지 않습니다. 파일 기반 솔루션으로 제안 할 수있는 항목. 일반적으로 차단 문제로 인해 파일에 데이터를 저장하지 않습니다. 파일에 삽입 될 때마다 잠금 상태가됩니다. – Incognito

3

대량 삽입은 아마 당신이

+0

나는 그가 SQL 서버가 얼마나 빠르다는 것을 이해하지 못한다고 생각한다. 그는 가장 빠른 인서트에 대해 물어보고 ADO.NET과 sprocs를 사용합니다. 나는 그가 어떻게 연결을 최선으로 열어 놓는가와 같은 것에 대해 걱정하고 있다고 생각합니다. 우리는 더 많은 요구 사항이 필요하다고 말합니다. – jcolebrand

2

은 "상황에 따라 다르다"는 SqlBulkCopy의 클래스를 사용할 수 있습니다, 그것은 최소한으로 기록되기 때문에 가장 빠른 것입니다.

  • 삽입하는 행의 개수는 무엇입니까?
  • 얼마나 자주 삽입됩니까?
  • 다른 데이터베이스 작업은 동시에 수행됩니까?
  • 사용자 동작 (단추 클릭) 또는 일부 외부 자극으로 인해 행이 삽입됩니까? 당신의 갱신을 바탕으로

, 난 당신이 간단한 코드 이외의 다른 메커니즘을 고려해야한다고 생각합니다. 대량 데이터베이스 작업에 최적화 된 SQL Server Integration Services를 살펴보십시오. 필요한 것은 특정 기준을 충족하는 모든 "새"데이터에 대량 삽입을 수행하기 위해 주기적으로 실행되는 간단한 SSIS 작업 일 수 있습니다. 스테이징 테이블이나 중간 서버와 같은 것들을 사용하는 것이 시간이 지남에 따라 수정이 필요하다면 수정을 허용합니다.

+0

매일 약 2mln이되지만 내년에는 증가 할 것입니다. 행을 외부 시스템 작업에 삽입 할 수 있도록 게이트웨이를 개발 중입니다. 테이블은 주로 트랜잭션을 저장하는 데 사용됩니다. – Incognito

+0

@Incognito : 또 다른 질문은 삽입물이 실시간으로 발생해야하는지 여부입니다. 특히, 삽입 될 행에 대한 요청 시간과 실제 삽입 사이에 얼마만큼의 지연을 수용 할 수 있습니까? –

+0

5 ~ 10 분 지연이 허용 될 수 있지만 실시간으로 제공 될 것으로 기대합니다. – Incognito

0

계산을 완료 했습니까? 2M/일 = 83k/시간 = 1388/분 = 23/초.

SQL Server는 초당 23 회의 삽입으로 땀을 흘리지 않습니다.

+2

그건 그들이 하루 종일 균등하게 들어 왔다고 가정하고 있습니다. 나는 생각하지 않습니다. –

+0

물론, 10 배의 속도에서도 아무런 문제가 없습니다. (나는 그의 응용 프로그램에 대해 몇 가지 가정을하고 있음을 알고 있습니다.) – egrunin

+0

예 SQL Server에서이를 처리 할 수 ​​있다고 생각합니다. 그러나 서비스 시간이 길어질수록 서비스 부하가 증가 할 것이라고 생각합니다. 그래서 향후 수정을 피하기 위해 높은 부하를 위해 서비스를 설계하려고합니다. – Incognito

관련 문제