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)
)
제프, 감사합니다. 실제 SQL 쿼리를 살펴보면 문제를 파악하는 데 도움이되었습니다. 내'select' 절에서 채웠던 객체의 속성 중 하나가 성능 저하를 일으키는 것으로 나타났습니다. 필자가 주석을 달았을 때 SQL 쿼리에 아무런 영향을 미치지 않았습니다! 이유는 확실하지 않지만 속성이 SQL에 해당하지 않는 System.Windows.Media.Brush이므로 생각합니다. 어쨌든 브러시를 별도의 foreach 루프로 설정하는 로직을 옮기면 쿼리 처리 시간이 ~ 3500ms에서 ~ 100ms로 줄어 들었습니다. 이것에 대한 설명이 있습니까? – devuxer
그것은 매우 흥미 롭습니다. Linq가 SQL을 유형과 일치시키고 일치를 찾을 수 없을 때 모든 행에 던져지는 내부 예외와 같은 것이 었는지 궁금합니다. 알기가 어렵습니다. 이유를 찾는 데 정말로 관심이 있다면 LinqToSQL 메서드에 대한 디버거 기호를 사용할 수 있습니다. http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx –