关于Db4o的查询测试及疑惑
时间:2010-09-10 来源:斯克迪亚
在Entity Framework中,我们通过Take()方法可以仅取得指定数量的数据,并且Entity Framework也只是从数据库中取出指定数量的数据而直接返回。
而Db4o虽然也可以在原生查询(NQ)之后追加Take()方法,但是经我测试认为其工作方式仍然是将所有数据先取出,然后再从所有数据中返回前五条……
测试过程
首先建立两个简单的类,用于对比测试:
public class 男人
{
public 男人(int 年龄)
{
this.年龄 = 年龄;
}
public int 年龄 { get; set; }
public override string ToString()
{
return "男人 年龄:" + 年龄;
}
}
public class 女人
{
public 女人(int 年龄)
{
this.年龄 = 年龄;
}
public int 年龄 { get; set; }
public override string ToString()
{
return "女人 年龄:" + 年龄;
}
}
而后,在命令行程序中引入Db4o的相关dll,并在Main函数中书写初始化测试环境的代码:
Random r = new Random();
var db = Db4oFactory.OpenFile("db.db4o");
for (int i = 0; i < 50000; i++)
{
db.Store(new 男人(r.Next(100)));
if (i < 10000)
{
db.Store(new 女人(r.Next(100)));
}
}
Console.WriteLine("初始化完毕,按回车键继续。");
在这里就是创建5万个男人对象和1万个女人对象存入数据库。
接着编写测试代码:
Start:
Console.ReadLine();
var a = DateTime.Now;
foreach (var f in db.Query<女人>().Take(5))
{
Console.WriteLine(f);
}
Console.WriteLine("读取女人数据耗时" + DateTime.Now.Subtract(a).TotalMilliseconds + "毫秒");
var b = DateTime.Now;
foreach (var f in db.Query<男人>().Take(5))
{
Console.WriteLine(f);
}
Console.WriteLine("读取男人数据耗时" + DateTime.Now.Subtract(b).TotalMilliseconds + "毫秒");
Console.WriteLine("按回车键重新测试");
goto Start;
这里我们使用Take()方法分别获取男人和女人的数据,并掐算其处理时间,看看数据库中的数据存储量是否对处理时间有所影响,如果有的话,就意味着Db4o并不是只读取5条数据就返回了,而是读取了全部数据。
测试结果视频:
可以看到,除了第一次因为首次加载原因,读取女人的数据比读取男人的数据慢很多之外,剩下所有测试都是读取女人的数据更快一些,尤其到最后的那几次测试,其耗时比例更是趋于与其数据量比例吻合。
有什么办法能让Db4o仅返回指定数量的数据呢?
经过一番搜索,我找到了很多篇关于Db4o分页的说明,在分页过程中取出指定数量的数据是必须的,但这些资料都是针对Java的,比如这篇IBM网站刊登出来的:《开源面向对象数据库 db4o 之旅,第 2 部分:db4o 查询方式》
其中关于分页部分这样写道:
但我真搞不懂这个list.get(x*2).getLicensePlate()究竟是什么玩意,是不是可以说取来的在真正被使用之前都仅仅是加载了一个IDs而已??
实在找不到关于.Net方面的相关资料呃,请高手赐教!