2009-12-02 3 views
1

우리는 데이터베이스에 수천 개의 결과를 반환 할 수있는 몇 가지 검색 기능을 가지고 있습니다. 처음 10 개의 레코드. 다음 페이지가 요청되면 db를 다시 방문합니다. 변수 집합을 기반으로 데이터베이스를 검색하면이 검색을 세분화하여 다른 데이터베이스를 검색 할 수 있습니다. 쿼리는 상당히 복잡합니다.읽기 전용 검색 기능. POCOs와 Ef 4.0을 사용하는 저장 프로 시저 또는 IQueryable

Google은 전반적인 아키텍처에 맞는 다양한 방법을 찾고 있습니다.

첫 번째 방법은 저장된 프로 시저를 사용하여 엔터티 목록을 채우는 것입니다. 이 저장된 proc은 빠르게 크고 방패가 될 수 있지만 더 나은 성능을 보입니다.

두 번째 방법은 Linq를 Entity Framework 4.0과 함께 Entites 또는 Entity SQL에 사용하고 개념적 계층에 걸쳐 코드로 쿼리를 만들고 IQueryable을 통해 POCO 개체를 채 웁니다. 이 중 우리에게 이점이 있습니다

  • 추상화 : 가능하면 우리가 추상화 된 모델에 검색을하고 싶은 것이, 그래서 우리는 응용 프로그램에서 다른 장소에서 EF를 사용하고 있습니다.
  • 유형 안전 우리가 체인에 IQueryable의 필터를 깨끗하게 우리가 개체에 수행 할 작업을 할 수있는이 방법으로 우리의 주요 관심사는 성능이다 방법

oirentated. 우리는 Parrlel LINQ to Entities를 사용하기를 희망하고 필요할 경우 더 많은 하드웨어를 던질 수 있습니다. 작은 성능의 히트는 더 깨끗한 개발 패턴에 적합합니다.

우리는 사람들의 생각과 권장 사항을 듣는 것에 감사하게 생각합니다. 우리는 이러한 기술을 많이 접했고 사람들의 경험을 듣고 싶습니다.

답변

1

일부 성능 테스트를 수행했으며 EF4.0에서 저장 프로 시저를 사용하여 엔티티 또는 복합 유형을 채우는 것이 ADO.NET을 통해 액세스되는 SP와 성능면에서 거의 동일하므로이 방법을 시도해 볼 것입니다. EF에 내장 된 쿼리를 사용하면 속도가 두 배나 느려지므로이 중요한 상황에서 SP를 사용하게됩니다.

0

당신은 궁극적 인 목표가 성능이라고했습니다. 그것은 ADO.NET과 곧바로 SQL을 의미합니다. 그 위에 EF를 추가하는 것은 상태 추적을 필요로하지 않고 업데이트 기능을 필요로하지 않으며 모든 결과를 사용하지 않는 무언가에 대한 엄청난 오버 헤드입니다.

데이터베이스에 대해 SQL을 작성하고 가능한 한 페이징을 수행하도록하십시오. 항목을 버릴 계획이라면 1,000 개의 항목을 가져 오지 마십시오. 또한 FTS 또는 인덱스 힌트 최적화와 같은 경우 EF를 사용하여 서버 성능을 활용할 수도 없습니다. 당신은 일반적이고 특정 하드웨어 나 서버를 이용하는 방법을 모르는 EF 런타임의 자비하에 있습니다.

또한 사용자가 일정 시간 동안 다음 세트를 쿼리하려고하는 일부 캐싱 계층을 살펴야합니다. 두 배의 초기 결과를 얻고 콜백 할 때 나머지 절반을 캐시하는 것이 더 저렴합니다. 그렇지 않으면 어느 시점에서 만료됩니다.

+0

그래, 우리는 확실히 전체 결과가 아닌 결과 세트를 반환하고 캐싱 레이어를 구현할 것입니다. 결과를 비교하기 위해 성능 테스트를 수행 할 것입니다. 우리는 EF의 발자국을 가능한 작게 만들기 위해 EF에서 POCO를 사용할 것입니다. 비록 이것이 여전히 상당히 클 수 있다고 생각합니다. 물론 느려지지만, 얼마나 많이 볼 수 있습니다! –