使用SubSonic获得单一记录的最快方法

时间:2009-05-03 21:16:04

标签: linq subsonic profiler crud

我是SubSonic和Linq Stuff的新手,我正在尝试找出检索单个记录的最短和最佳方式。

还有哪种方法更快,并且需要更少的代码才能获得单个记录?

User user2 = DB.Select().From(User.Schema)
.Where(User.PasswordColumn).IsEqualTo(password)
.And(User.SINumberColumn).IsEqualTo(siNumber)
.ExecuteSingle<User>();

我已经习惯使用AntsProfiler工具进行检查,这需要平均29.12ms的CPU时间 - 经过十次运行测试

这需要更长的时间

UserController uc = new UserController();
Query query = new Query("User");
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);   
User user = uc.FetchByQuery(query).First<User>();

最后一行需要256.08ms CPU时间加上UserController需要66.86ms。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

“瓶颈”将是生成的查询执行,而不是SubSonic生成它或返回结果。如果特定查询很慢,您应该考虑使用数据库提供程序的索引函数来优化它。

在第二种情况下,我假设额外的执行时间是LINQ从集合中返回第一个项目的开销。

所以我的答案是,第一种方法是最好的方法,如果29ms是不可接受的(对于DB的调用,我认为不合理),在你的中添加一些索引DB加速检索。

答案 1 :(得分:1)

IIRC,Query对象流畅..即

query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);

读作:

query = query.WHERE(User.Columns.Password, password);
query = query.WHERE(User.Columns.SINumber, siNumber);

测试中增加的时间可能因此而被考虑(您要求所有用户项目,然后抓住第一个)。

答案 2 :(得分:0)

我认为约翰对这笔钱是正确的。如果你真的想测试SubSonic,看看需要花多少时间来测试创建SQL语句亚音速所需的时间,而不是SubSonic创建SQL语句需要多长时间以及数据库返回结果需要多长时间同时(你需要隔离你的测试)。

也许您应该测试使用常规旧SQLCommand获取结果所需的时间,并将连接和参数传递给它,并查看需要多长时间才能进行比较。