2014-07-12 2 views
0

프로젝트에서 작업 중이며 을 사용하여에서 가져온 데이터를 시각화합니다. 내가 같이보기로 결과를 반환 할 때데이터베이스 호출 1 회를 사용하여 LINQ2Entities를 사용하여 사용자 지정 페이지 매김을 구현하는 방법

var queryResult = query.Select(p => new[] { p.Id.ToString(), 
              p.Name, 
              p.Weight.ToString(), 
              p.Address }) 
              .Skip(iDisplayStart) 
              .Take(iDisplayLength).ToArray(); 

내가 얻을 결과 : 나는 지금까지있는이 코드가 현재 페이지 및 결과의 총 수에 대한 결과를 전달해야

iTotalRecords = queryResult.Count(), 

은 페이지 당 표시 할 레코드 수입니다. 논리,하지만 내 방법 체인을 구축하는 동안 그것에 대해 생각하지 않았습니다. 이제는 이것을 구현하는 최적의 방법에 대해 생각합니다. 상대적으로 많은 양의 데이터 (10,000 행 이상)를 사용하기 때문에 SQL 서버에서 최대한 많은 작업을하고 싶습니다. 그러나이 질문에 대한 몇 가지 질문을 발견하고 인상을 얻을 데이터베이스에 두 개의 쿼리를 만들거나 내 코드에서 전체 결과를 조작해야한다는 것입니다. 그러나 나는 많은 레코드로 작업해야 할 때 이것이 효율적이지 않을 것이라고 생각합니다.

그래서 최상의 성능을 얻으려면 여기에서 무엇을 할 수 있습니까?

답변

1

당신이 찾고있는 것에 관해서 나는 간단한 대답이 있다고 생각하지 않습니다.

나는 이것이 현재 수행 할 수있는 유일한 방법은 저장 프로 시저 (SPROC) 호출로 캡슐화되거나 EF에 의해 생성되는지 여부와 같이 이미 제안한 것처럼 둘 이상의 쿼리를 실행하는 것입니다.

그러나 쿼리를 더 빨리 실행할 수 있도록 최적화 할 수 있다고 생각합니다.

우선, 쿼리를 실행하면 메서드를 체인으로 연결할 때 쿼리가 다시 캐시 될 수 있습니다. 즉, 실행중인 실제 쿼리를 SQL Server에서 다시 컴파일하고 캐시해야합니다. 기술). 일반적으로 몇 밀리 초 밖에 걸리지 않지만 실행되는 쿼리에 몇 밀리 초가 소요되는 경우 상대적으로 비용이 많이 듭니다.

Entity 프레임 워크는이 Linq 쿼리를 변환하고 파생 테이블을 사용하여 실행합니다. 작은 결과 집합으로 약. 1k 레코드를 호출하여 현재 솔루션이 가장 적합 할 수 있습니다. 이는 또한 SQL 필터링이 메소드 체인에 의해 생성 된 것과 얼마나 복잡한 지에 달려 있습니다.

페이징 할 결과 집합이 15k까지 증가하면 스프레드 시트를 작성하여 임시 테이블에 레코드를 삽입하고 두 쿼리를 실행하여 최상의 성능과 확장 성을 얻으십시오. 기록하고 두 번째로 전체 결과를 얻습니다.

EF를 사용하여 SPROC 호출을 엔터티 형식에 매핑하거나 결과와 결과 개수가 포함 된 새로운 사용자 지정 형식을 만들 수 있습니다. Stored Procedures with Multiple Results

위의 SPROC를 실행하는 비용은 결과 집합 크기 15k 레코드를 기반으로 동일한 결과를 얻기 위해 EF가 생성 한 쿼리를 실행하는 데 약 3 분의 1이 걸린 것으로 나타났습니다. 그러나 임시 테이블 생성으로 인해 1K 레코드 결과 세트 만 있으면 EF 쿼리보다 3 배 더 느립니다.

SPROC에서이 논리를 캡슐화하면 응용 프로그램 기반 코드를 변경하지 않고도 결과 집합이 커짐에 따라 쿼리가 리팩터링되고 최적화 될 수 있습니다.

SPROC와 쿼리를 직접 실행하는 데 성능 차이가 크다는 것을 알았 기 때문에 제안 된 솔루션은 SPROC 내부의 Entity Framework에서 작성한 파생 테이블 쿼리를 사용하지 않습니다.

+0

아주 좋은 대답입니다. 지식을 공유해 주셔서 감사합니다! – Leron

관련 문제