在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 查询方式》

其中关于分页部分这样写道:

image

但我真搞不懂这个list.get(x*2).getLicensePlate()究竟是什么玩意,是不是可以说取来的在真正被使用之前都仅仅是加载了一个IDs而已??

实在找不到关于.Net方面的相关资料呃,请高手赐教!

posted on 2010-09-10 01:19  斯克迪亚  阅读(2192)  评论(8编辑  收藏  举报