2010-07-01 4 views
0

SubmitChanges에 전화하기 전에 전화 번호 InsertOnSubmit을 몇 번이나 불러야합니까? 한 시간에 수십만 개의 레코드를 반환 할 수있는 웹 서비스의 데이터를 추가하고 있습니다. 웹 서비스를 둘러싼 래퍼 클래스는 레코드를 IEnumberable 컬렉션에 노출시켜 정교한 청킹 메커니즘을 숨 깁니다.많은 수의 삽입에 대해 DataContext.SubmitChanges()를 얼마나 자주 호출합니까?

제출하기 전에 누적해야하는 인서트 수에 대한 지침이 있습니까?

+0

나는 같은 문제가 있고, 답을 찾고 연령을 보냈다. 결국 이것은 내 생명의 은인이었습니다 ... 즐기십시오. http://mikesknowledgebase.com/pages/LINQ/InsertAndDeletes.htm –

답변

3

또한 삽입해야하는 데이터의 종류에 따라 다릅니다. 때로는 다른 테이블에 레코드를 더 삽입하기 위해 많은 수의 레코드를 삽입해야합니다.

데이터베이스에 변경 사항을 제출할 때 ID가 할당되므로 특정 시간에 SubmitChanges를 호출해야합니다. 이 필요하지 않은 경우

은, 난 그냥 (내가 삽입해야 레코드의 총 수에 따라) 한 번 정도 1000로 제출합니다.

어쩌면 속도 테스트를 할 수 있습니다. 하드웨어에 따라, 레코드 양 등의 기대에 따라 달라집니다.

+0

ID를 다시 가져 오는 것과 관련하여 좋은 지적입니다. 몇 가지 큰 레코드가있을 수 있으므로 한 번에 1000 개가 시작할 수 있으므로 메모리 발자국이 걱정됩니다. –

+0

그래, 그게 내가 정말 싫어하는 한가지 야. 때로는 각 레코드에 새로운 ID가 필요하기 때문에 좋은 성능을 위해 레코드 방식을 많이 제출하게됩니다. 이것은 코드에서 알아 내야 할 필요가있는 곳이며, 필요한 곳과 나중에 제출할 수있는 곳을보기 위해서입니다. –

1

실제로 "지침"은 없습니다. 이드는 효율성을 위해 무리를 모으고 싶다고 말하고 싶지만, 아마 10k는 아니지만 100을 말하고 싶습니까? 이렇게하면 DB 쿼리가 크게 줄어들고 트랜잭션을 구축하는 동안 로컬로 캐싱하는 RAM을 너무 많이 먹지 않아야합니다.

당신은 아마 몇 가지 다른 값으로 테스트하고 있지만 하드웨어에 대한 최적의 해결책을 찾기 위해 성능 (메모리 & 속도) 프로필한다.

3

글쎄, 여러 테이블에 걸쳐 수십만 개의 레코드를 가지고 문제없이 진행했습니다. 실제로, 모든 InsertOnSubmit()에 대해 SubmitChanges()를 호출하는 것과 같은 경우에는 몇 시간이 걸릴 것입니다. 마지막에 SubmitChanges()를 호출하면 여러 레코드를 몇 분 내에 삽입하는 데 걸리는 시간이 단축됩니다.

제가 전술 한 경우에는, 내가 가진 장치는, (헤더에 링크) 정보 테이블 원자 테이블 (어느 세부에 링크) 헤더 테이블 테이블을보고 하였다. 모든 헤더 레코드에 대해, 나는 여러개의 원자 레코드에 의해 다시 연결될 다수의 세부 테이블을 가졌다. 어떤 경우에는, 내가 gazillions 레코드를 삽입 결국 그들은 모든 단일 SubmitChanges() 호출에 아무런 문제가 끝날거야 그리고 그것은 모두 아주 잘 수행했다.

3

한 번에 한 번에 1 번 대 1000 번 레코드를 한 번에 하나씩 변경하려면 : 한 번에 하나의 레코드에 대해 레코드를 일괄 적으로 0.1989 초당 0.0711 초 /기록. 따라서 일괄 처리는 테스트에서 약 3 배 빠릅니다. 배치 크기는 효율성면에서 다양합니다.

submitchanges()를 한 번에 한 레코드
레코드 초 초/기록
1,000 198.95 0.1989

배치 submitchanges()
레코드 초 초/기록 변화율
100 12.20 0.1220 1백33퍼센트
200 18.33 0.0916 122퍼센트
500 37.59 0.0752 1백6퍼센트 012, 1,000 71.07 0.0711 103퍼센트
2,000 138.64 0.0693 102 %
1 만 680.36 0.0680

관련 문제