我开发的模块会进行大量的小选择,插入和更新。 SubSonic.Query
命名空间(ActiveRecord is not my weapon of choice)中的命令所做的修改似乎比用LINQ
编写的逐个id选择查询快得多。
执行以下LINQ
查询1000次
long a = (
from u in UserCollection
where u.UserId == value
select u.UserId
).FirstOrDefault<long>();
Select
查询
long a = new SubSonic.Query.Select(provider, "UserId").From<User>()
.Where<User>(x => x.UserId == value).ExecuteScalar<long>();
我花了一些时间来看看SubSonic中的LINQ。分析器告诉DbQueryProvider.Execute
调用的大部分处理器时间花费在DbQueryProvider.GetExecutionPlan
方法中 - 64%。当System.Linq.Expressions.Complie
仅使用6%的时间时,DbQueryProvider.Execute
花费了22%。
我对SubSonic LINQ查询如何解析和编译完全满意。但是,使用编译工具来重复SubSonic LINQ查询就像System.Data.Linq.CompiledQuery
中的Linq2Sql
一样。
答案 0 :(得分:0)
我们也对此进行了一些分析,发现SubSonic的记录.SingleOrDefault(x =&gt; x.id = someval)比通过CodingHorror完成的同一查询慢20倍。在此处记录: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
);
令人失望,因为我非常喜欢SubSonic / Linq。
最后我们放弃了,我写了这个 - http://www.toptensoftware.com/petapoco。移植后,我们的负载测试显示每秒请求数增加,CPU负载从大约80%下降到5%。