2013-03-23 3 views
18

최근 엔 4.1을 사용하는 ObjectContext에서 5.0을 사용하는 DbContext로 엔티티 모델을 옮겼습니다. 나는 DbContext 대 ObjectContext를 사용하는 질의에 대해 매우 열악한 성능을 느꼈기 때문에 그 일을 후회하기 시작했습니다. 테스트 시나리오는 다음과 같습니다.DbContext 질의 성능이 좋지 않거나 ObjectContext가 됨

두 컨텍스트 모두 약 600 개의 테이블과 동일한 데이터베이스를 사용합니다. LazyLoading 및 ProxyCreation은 두 가지 모두 해제되어 있습니다 (코드 예제에서는 표시되지 않음). 둘 다 미리 생성 된보기를 가지고 있습니다.

시험은 먼저 메타 데이터 작업 공간을로드 한 호출합니다. 그런 다음 for 루프에서 100 번 실행되면 컨텍스트를 새로 작성하고 처음 10 초가 걸리는 한 번의 호출을 작성합니다. for 루프 내부에 컨텍스트를 작성합니다. WCF 서비스에서이 컨텍스트를 사용하므로이 컨텍스트가 작성됩니다. 컨텍스트마다 매번)

이 작업을 ObjectContext와 함께 실행하면 약 4.5 초가 걸립니다. DbContext를 사용하여 실행하면 약 17 초가 걸립니다. RedGate의 성능 프로파일 러를 사용하여 프로파일 링했습니다. DbContext의 경우 주요 원인은 UpdateEntitySetMappings라는 메서드입니다. 이것은 모든 쿼리에서 호출되며 메타 데이터 워크 스페이스를 검색하고 OSpace의 모든 항목을 순환합니다. AsNoTracking이 도움이되지 않았습니다.

편집 : 더 좋은 내용을 제공하기 위해, 문제는 ObjectSet을 대 DbSet의 생성 \ 초기화가 아닌 실제 쿼리를 함께 할 수있다. ObjectContext를 사용하여 호출하면 ObjectSet을 만들기 위해 평균 42ms가 소요됩니다. DbContext로 전화를 걸면 내부 dbset을 생성하는 데 약 140ms가 걸립니다. ObjectSet과 DbSet은 모두 메타 데이터 공간에서 개체 세트 매핑 조회를 수행합니다. DbSet은 ObjectSet이 작동하지 않는 동안 작업 공간의 모든 유형에 대해 DbSet을 수행한다는 것을 알았습니다. 성능 차이가 적은 테이블이 적은 모델을 추측하고 있습니다 (시도하지 않았습니다).

답변

2

DbContext는 ObjectContext를위한 래퍼입니다. 질문에 대한 답변은 answer입니다. 성능을 희생시키면서 사용하기가 더 쉬울 수도 있습니다.

-3

나는 수백만 개의 레코드를 쿼리하기 위해 Simple.Data을 사용하며 아주 잘 작동합니다.

4

나는 또한 코드 첫 번째 방법의 저조한 성과 우려했습니다과 DbContext이기 때문에 나는, 그 결과는 더 깜짝하지 않았다 당신

http://netpl.blogspot.com/2013/05/yet-another-orm-micro-benchmark-part-23_15.html

유사한 시나리오에서 일부 벤치 마크를 수행했습니다 ObjectContext에 대한 래퍼 (wrapper)는 단순성을 위해 성능을 희생해야합니다. 하지만, 내 테스트는 것을 보여 당신이 더 빨리 원하는 경우가 더 중요한 추적 해제 검색의 차이를

  • 더 기록하면 덜 검색
  • 더 많은 기록이다
10 기록

enter image description here

주 그 코드가 처음보다 훨씬 느립니다 검색 예를 들어

, 모델을 먼저 사용하면 추적과 추적이 눈에 띄는 차이가 없습니다. 두 가지 관찰은 모두 사용자의 것과 같습니다.10000 개 행을 검색 할 때

그러나 먼저 notracking 버전의 첫 번째 코드와 모델 사이에 거의 차이가 없다는 것을

enter image description here

참고 있습니다. 또한, 둘 다 raw ado.net 데이터 아머만큼 빠르게 놀랍도록 잘 수행됩니다.

자세한 내용은 내 블로그 항목을 따르십시오.

간단한 벤치 마크를 통해 코드의 특성을 먼저 받아 들일 수있었습니다. Poco 엔티티와 마이그레이션이라는 두 가지 기능으로 인해 더 작은 프로젝트에서 더 선호합니다. 반면에 필자는 성능이 중요한 요구 사항 인 프로젝트에서는이 두 가지 중 하나를 선택하지 않습니다. 이것은 아마도 모델의 첫 번째 접근 방식을 결코 다시는 사용하지 않을 것임을 의미합니다.

(측면 참고 :. 내 벤치 마크는 제가 NH 매일을 사용하는 두 개의 독립 개발자 상담을 한 경우에도이 설명하는 데 도움이 nHibernate 수에 뭔가 내가 아직 발견하지 않은 사람이 있다는 것을 알)