설정 변경 ~ 저장하는 40 ~ 60 초에서 취SaveChanges를 8000 문맥
- 엔티티 프레임 워크 4 게으른 로딩 활성화 (모델 첫째, 테이블 당 계층 구조).
- 테이블의 수는 약 40 개 (테이블에는 15-20 개 이상의 필드가 없습니다).
- SQL Server Express 2008 (r2가 아님).
- 데이터베이스 트리거 또는 기타 이와 같은 것들은 존재하지 않습니다. 이는 저장 용으로 만 사용됩니다. 모든 논리가 코드에 있습니다.
- 현재 데이터베이스 크기는 약 2GB입니다.
- (기본 키의 GUID하고
Guid.NewGuid()
통해 코드 생성된다 -이 문제 경우) - (복잡한 객체 그래프를 생성) 복잡한 연산 결과를 저장하는 40 내지 60 초 (
SaveChanges
의해 반환 번호가 어디서나 얻어 약 8000 - 주로 추가 된 객체와 일부 수정 됨). - 빈 (또는 거의 비어있는) 데이터베이스에서 동일한 작업 결과를 저장하면 대개 같은 컴퓨터에서 약 1 초가 걸립니다.
이 문제에 영향을주는 변수는 데이터베이스 크기뿐입니다. 그러나 나는 단지 Context.SaveChages()
전화를 측정하고 있기 때문에 (이 문제에 영향을 미치지 않아야 할 이상한 부진한 쿼리가 있더라도).
이 작업이 왜 이렇게 오래 지속될 수 있는지에 대한 제안 사항에 감사드립니다.
Stopwatch sw = Stopwatch.StartNew();
int count = objectContext.SaveChanges(); // this method is not overridden
Debug.Write(sw.ElapsedMilliseconds); // prints out 40000 - 60000 ms
Debug.Write(count); // I am testing with exactly the same operation and the
// result always gives the same count for it (8460)
: -
는 UPDATE는
1은 그냥 명확하게 실행 40-60초 소요되는 코드를 (이것은이 긴 경우에만 DB 크기가 2GB 주위 때 소요) 빈 DB를 사용하는 동일한 작업에는 1000 밀리 초가 걸립니다 (여전히 8460을 제공함). 따라서 질문은 - 데이터베이스 크기가 SaveChanges()
에 어떻게 영향을 미칠 수 있습니까? 있다 3
Method: static SNINativeMethodWrapper.SNIReadSync
Called: 3251 times
Avg: 10.56 ms
Max: 264.25 ms
Min: 0.01 ms
Total: 34338.51 ms
업데이트 :
업데이트 2
반환 한 프로파일 러를 실행하면 ("코드의 관점"에서) 주요 병목 현상은 다음과 같은 방법임을 보여줍니다 데이터베이스의 모든 PK 및 FK에 대한 비 클러스터형 인덱스 우리는 랜덤 Guid를 대리 키 (순차가 아닌)로 사용하고 있으므로 조각화는 항상 매우 높은 수준입니다. 나는 모든 DB 인덱스를 재구성 한 직후에 문제의 연산을 테스트하는 것을 시도했지만 (모든 인덱스에 대해 단편화가 2 ~ 3 % 미만 이었지만) 상황을 개선하지는 못했습니다.
또한 문제의 작업 중 하나의 테이블에는 약 4 백만 행이 있습니다 (이 테이블에는 많은 삽입이 있음). SQL 프로파일 러는 해당 테이블에 대한 삽입이 1 ~ 200ms 사이에서 지속될 수 있음을 보여줍니다 ("스파이크"). 다시 한번 말하지만, 색인이 새로 고쳐지면이 변경 사항이 보이지 않는 것 같습니다.
어쨌든 - 시간이 많이 걸리기 때문에 문제는 응용 프로그램의 SQL Server쪽에있는 것 같습니다 (SNIReadSync
메서드). 내가 완전히 무지한 경우에 나를 정정하십시오.
테이블의 기본 키 인덱스를 사용하는 두 번째 쿼리 내부의 루프 여야합니다 ... 아, 코드 또는 데이터베이스 구조를 볼 수 없었기 때문에 추측이었습니다. –
비 순차적 GUID를 사용하면 삽입에 대한 성능이 저하 될 수 있지만 테이블이 상당히 크지 않으면 (예상치로 100 만 개가 넘지 않을 수도 있습니다.) – leppie
@ MarkSchultheiss 실제로 질문을 읽었습니까? 어떤 코드를보고 싶니? 'ObjectContext.SaveChages()'를 반영 했습니까? 그것이 저조한 선이므로 (스톱워치에 따라). 전체 데이터베이스 구조를 게시하는 것은 상당히 복잡하기 때문에 문제가 많습니다 (단지 10-15 개의 테이블을 상상할 수 있습니다). 특히 당신이 알아야 할 것은 무엇입니까? 마지막 두 글 머리표 - 내 문제의 이상한 부분을 확인하십시오. SaveChanges() 실행 시간이 DB 크기가 커지면서 증가하는 이유는 무엇입니까? – Jefim