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


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2010/09/10/1822898.html,如需转载请自行联系原作者

相关文章
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(一)
43 4
|
1月前
|
SQL
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
Hadoop-14-Hive HQL学习与测试 表连接查询 HDFS数据导入导出等操作 逻辑运算 函数查询 全表查询 WHERE GROUP BY ORDER BY(二)
37 2
|
3月前
|
测试技术 API 开发者
Python 魔法:打造你的第一个天气查询小工具自动化测试框架的构建与实践
【8月更文挑战第31天】在这篇文章中,我们将一起踏上编程的奇妙旅程。想象一下,只需几行代码,就能让计算机告诉你明天是否要带伞。是的,你没有听错,我们将用Python这把钥匙,解锁天气预报的秘密。不论你是编程新手还是想拓展技能的老手,这篇文章都会为你带来新的视角和灵感。所以,拿起你的键盘,让我们一起创造属于自己的天气小工具吧!
|
3月前
|
JavaScript 前端开发 应用服务中间件
【qkl】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
|
自然语言处理 搜索推荐 Java
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
266 0
|
关系型数据库 MySQL 测试技术
软件测试|MySQL BETWEEN AND:范围查询详解
软件测试|MySQL BETWEEN AND:范围查询详解
|
关系型数据库 MySQL 测试技术
软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
|
关系型数据库 MySQL 测试技术
软件测试|MySQL ORDER BY详解:排序查询的利器
软件测试|MySQL ORDER BY详解:排序查询的利器
|
Java 数据库连接 mybatis
mybatis的查询结果接收测试
只有聪明人才能看见的简介~( ̄▽ ̄~)~
98 0