2010-05-21 2 views
2

LinqToSql을 사용하여 작고 간단한 SQL Server CE 데이터베이스를 쿼리하고 있습니다.EntitySet 속성을 사용하는 LinqToSql 쿼리의 성능을 어떻게 향상시킬 수 있습니까?

하위 속성과 관련된 작업이 실망스럽게 느린 것으로 나타났습니다.

예를 들어, Order 테이블로 참조되는 Customer 테이블이 있으면 LinqToSql이 자동으로 EntitySet<Order> 속성을 만듭니다. 이것은 편리한 편의이며, Customer.Order.Where(o => o.ProductName = "Stopwatch")과 같은 일을 할 수있게 해주지 만, 어떤 이유로 SQL Server CE는 이와 같은 작업을 시도 할 때 꽤 심하게 끊깁니다. 정말 복잡하지 않은 쿼리 중 하나는 완료하는 데 3-4 초가 걸립니다.

두 개의 테이블을 개별적으로 가져 와서 List<Customer>List<Order>으로 변환 한 다음 내 자신의 쿼리로 수동으로 조인 할 수 있지만 추가 코드가 많이 필요합니다. LinqToSql은 이러한 EntitySet<T> 속성을 자동으로 생성합니다. 사용하고 싶습니다.

그럼 어떻게 성능을 향상시킬 수 있습니까? 예를 들어 DataContext 옵션이 도움이 될까요?

참고 : 데이터베이스의 초기 상태는 약 250K이며, 1-2Mb 이상으로 증가하지는 않을 것으로 예상됩니다. 그래서 많은 레코드가있는 것과는 다릅니다.


업데이트 여기

내가 내 질문에 사용 된 예를 들어 테이블 정의입니다 : 내가 전에 SQL로 Linq를 사용하여 SQL 서버 CE를 사용하지 않는 한

create table Order 
(
    Id int identity(1, 1) primary key, 
    ProductName ntext null, 
    Quantity int null 
) 

create table Customer 
(
    Id int identity(1, 1) primary key, 
    OrderId int null references Order (Id) 
) 

답변

2

는하지만, 이러한 작은 DB를 사용하면 디스크 액세스보다 성능 문제가 쿼리 최적화 문제와 관련이 있다고합니다.

Linq에서 SQL 개체로 SQL 쿼리를 가져 와서 무슨 일이 일어나는지보십시오. CE 데이터베이스에 대해 이러한 쿼리를 수동으로 실행하여 수행 방법을 확인할 수도 있습니다.

올바른 색인을 추가하면 문제가 해결 될 가능성이 매우 높습니다.

LinqToSQL Profiler를 사용해보십시오. http://l2sprof.com/

+1

제프, 감사합니다. 실제 SQL 쿼리를 살펴보면 문제를 파악하는 데 도움이되었습니다. 내'select' 절에서 채웠던 객체의 속성 중 하나가 성능 저하를 일으키는 것으로 나타났습니다. 필자가 주석을 달았을 때 SQL 쿼리에 아무런 영향을 미치지 않았습니다! 이유는 확실하지 않지만 속성이 SQL에 해당하지 않는 System.Windows.Media.Brush이므로 생각합니다. 어쨌든 브러시를 별도의 foreach 루프로 설정하는 로직을 옮기면 쿼리 처리 시간이 ~ 3500ms에서 ~ 100ms로 줄어 들었습니다. 이것에 대한 설명이 있습니까? – devuxer

+0

그것은 매우 흥미 롭습니다. Linq가 SQL을 유형과 일치시키고 일치를 찾을 수 없을 때 모든 행에 던져지는 내부 예외와 같은 것이 었는지 궁금합니다. 알기가 어렵습니다. 이유를 찾는 데 정말로 관심이 있다면 LinqToSQL 메서드에 대한 디버거 기호를 사용할 수 있습니다. http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx –

관련 문제