【问题标题】:db4o Indexing problem - Not Working? Poor performance?db4o 索引问题 - 不工作?表现不佳?
【发布时间】:2010-02-25 21:01:11
【问题描述】:

我正在尝试使用 db4o 作为我的新网站的后端。

按照我的想法,我已经进行了设置,并插入了大约 5k 条记录(只有一种对象类型,大约有 7 个原始字段)。

根据我阅读的一些博客文章,我已将属性设置为非自动属性,并尝试在公共属性公开的私有成员上设置索引。

查询性能真的很差,应该是一个简单的索引查找最多需要 3/4 秒。

我的实现如下: 我的“服务器”是一个静态单例,每个应用程序实例只打开一次。

Db4oFactory.Configure().ObjectClass(typeof(MyObject)).ObjectField("_Id").Indexed(true);
server = Db4oClientServer.OpenServer("DatabseName", 0);

然后,查询:

using (var ooDB = server.OpenClient())
{
    var movieFound = (from MyObject m in ooDB
                    where m.Id == IdToFind
                    select m).FirstOrDefault();
}

我的对象为:

public class MyObject
{
    protected string _Id;
    public string Id 
    { 
        get { return _Id; } 
        set { _Id = value; } 
    }
}

对象的 ID 是一个字符串。

我做错了什么!

干杯, 戴夫

【问题讨论】:

    标签: c# db4o


    【解决方案1】:

    这是旧 API(7.4 版,为了兼容性而保留在这里)和新 API(7.12 版)的不幸组合。没有使用配置,所以没有创建索引。

    方法调用“Db4oFactory.Configure()”属于较旧的 API。它仅在您使用旧 API:“Db4oFactory.OpenServer()”创建 ObjectContainer 时使用。这种全局配置有一些潜在的问题。所以我会避免它。

    现在我建议使用新的 API。在那里,您必须显式传递配置。配置界面也更干净。尤其是客户端/服务器配置是分开的。使用“Db4oClientServer.NewServerConfiguration()”创建新配置。然后将其传递给“Db4oClientServer.OpenServer”。所以在你的情况下,这将是:

            IServerConfiguration cfg = Db4oClientServer.NewServerConfiguration();
            cfg.Common.ObjectClass(typeof(MyObject)).ObjectField("_Id").Indexed(true);
    
            IObjectServer server = Db4oClientServer.OpenServer(cfg, "DatabseName.db4o", 0);
    

    【讨论】:

    • 您好,我听从了您的建议,但我认为说得太早了。我以为我已经从正常工作的索引中获得了改进的性能 - 但是我这只是因为我截断了我的数据库 - 一旦项目数量接近几千,查询时间就会成倍增加 - 向我表明索引没有被使用。
    • 嗨,它应该可以工作。您可以配置诊断侦听器。因此可以查看是否使用了索引:'cfg.Common.Diagnostic.AddListener(new DiagnosticToConsole())'。请注意,第一次 LINQ 查询需要更长的时间,因为必须初始化 db4o-LINQ 系统等。在我的示例中,索引用于查询。对于 20'000 个简单对象,大约需要 4-5 毫秒。没有索引大约 300 毫秒。无论如何,我已经上传了源代码。所以你可以检查它是否在你的机器上工作:gamlor.info/files/dotNet/IndexOnStringField.cs
    • 为了使这个工作,您必须将所有对象都放在 MyObject 类型的 db4o 中或从 MyObject 中驻留?
    【解决方案2】:

    我有一段时间没有使用 db4o,但这里让我印象深刻的是您查询属性并在支持字段上创建索引。除非 db4o 设法理解这种关系(它可能,但我现在怀疑它)它将恢复每个存储的实例以访问该属性并评估您的查询..

    您能否链接到要求对索引进行这种设置的帖子?

    【讨论】:

    • 实际上 db4o-LINQ 实现会找出属性后面的字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多