• 关于Db4o的查询测试及疑惑


    在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方面的相关资料呃,请高手赐教!

  • 相关阅读:
    51nod 1138 【数学-等差数列】
    hdoj3665【简单DFS】
    hdoj3664【DP】
    51nod1270 【dp】
    51nod 1069【思维】
    关于一些数学符号和概率的阐述;
    51nod 1428【贪心】
    51nod 1133【贪心】
    51nod1127【尺取】
    51nod1126【矩阵快速幂】
  • 原文地址:https://www.cnblogs.com/SkyD/p/1822898.html
Copyright © 2020-2023  润新知