2010-12-30 4 views
0

모듈을 개발하면 작은 선택, 삽입 및 업데이트가 많이 발생합니다. SubSonic.Query 네임 스페이스 (ActiveRecord is not my weapon of choice)의 명령으로 수정 한 내용은 LINQ으로 작성된 개체 별 선택 쿼리보다 훨씬 빠르게 나타납니다.SubSonic LINQ 쿼리가 SubSonic.Query.Select보다 3 배 느립니다.

그것은 LINQ 쿼리 다음 실행 7.15s 소요 1000 배

나는 후드 볼 수있는 시간이 걸렸 만 2.38s Select 쿼리

long a = new SubSonic.Query.Select(provider, "UserId").From<User>() 
    .Where<User>(x => x.UserId == value).ExecuteScalar<long>();

의 수천 실행을위한 동안

long a = (
    from u in UserCollection 
    where u.UserId == value 
    select u.UserId 
).FirstOrDefault<long>();

LINQ of Subsonic. 프로파일 러는 DbQueryProvider.Execute 호출의 프로세서 시간 중 많은 부분이 DbQueryProvider.GetExecutionPlan 방법 (64 %)에서 소비됨을 알립니다. System.Linq.Expressions.Complie에서 22 %가 소비되며, DbQueryProvider.Execute은 6 %의 시간 만 사용합니다.

SubSonic LINQ 쿼리를 구문 분석하고 컴파일하는 방법을 완전히 만족합니다. 그러나 System.Data.Linq.CompiledQueryLinq2Sql과 같이 SubSonic LINQ 쿼리를 되돌리기위한 컴파일 기능이 있으면 좋을 것입니다.

+0

정말 문제입니까? 그것은 진정한 목적을 위해 너무 느리게 보이지 않습니다. – ykatchou

+0

실제 웹 응용 프로그램을 의미합니까? 이 문제는 저에게 중요한 문제입니다. 작은 선택 및 삽입으로 400k 트랜잭션을 수행하는 데 걸리는 시간을 상상해보십시오. SubSonic3은 삽입 + 선택을 허용하지 않으므로 기본 키를 선택해야합니다. – Mike

답변

0

우리는 이것에 대해서도 약간의 프로파일을 만들었고 CodingHorror를 통해 수행 된 동일한 쿼리보다 20 배 더 느려지도록 SubSonic의 record.SingleOrDefault (x => x.id = someval)를 발견했습니다. 여기에 로그인 : https://github.com/subsonic/SubSonic-3.0/issues/258.

프로파일 러는 ExecutionBuilder.cs이 지적했다 :

// this sucks, but since we don't track true SQL types through the query, and ADO throws exception if you 
// call the wrong accessor, the best we can do is call GetValue and Convert.ChangeType 
Expression value = Expression.Convert(
    Expression.Call(typeof (Convert), "ChangeType", null, 
        Expression.Call(reader, "GetValue", null, Expression.Constant(iOrdinal)), 
        Expression.Constant(TypeHelper.GetNonNullableType(column.Type), typeof(Type)) 
     ), 
    column.Type 
    ); 

실망 때문에 정말 음속/Linq에있다.

결국 우리는 포기하고 이것을 작성했습니다 - http://www.toptensoftware.com/petapoco. 포팅 후 우리의 부하 테스트는 초당 요청이 올라 갔고 CPU로드가 약 80 %에서 5 %로 떨어졌습니다.