0

とリポジトリがありoriginalpremium両方にインデックスを追加しようとしました。

    public void SetupIndices()
    {
        original.Ext().Configure().ObjectClass(typeof(LineItem)).ObjectField("idField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(LineItem), "idField"));
        original.Ext().Configure().ObjectClass(typeof(LineItem)).ObjectField("nameField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(LineItem), "nameField"));
        original.Ext().Configure().ObjectClass(typeof(Order)).ObjectField("idField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Order), "idField"));
        original.Ext().Configure().ObjectClass(typeof(Order)).ObjectField("nameField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Order), "nameField"));
        original.Ext().Configure().ObjectClass(typeof(Creative)).ObjectField("idField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Creative), "idField"));
        original.Ext().Configure().ObjectClass(typeof(Creative)).ObjectField("nameField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Creative), "nameField"));
        original.Ext().Configure().ObjectClass(typeof(Company)).ObjectField("idField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Company), "idField"));
        original.Ext().Configure().ObjectClass(typeof(Company)).ObjectField("nameField").Indexed(true);
        original.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Company), "nameField"));
        original.Ext().Configure().ObjectClass(typeof(LineItemCreativeAssociation)).ObjectField("lineItemIdField").Indexed(true);
        original.Ext().Configure().ObjectClass(typeof(LineItemCreativeAssociation)).ObjectField("creativeIdField").Indexed(true);

        original.Commit();

        premium.Ext().Configure().ObjectClass(typeof(LineItem)).ObjectField("idField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(LineItem), "idField"));
        premium.Ext().Configure().ObjectClass(typeof(LineItem)).ObjectField("nameField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(LineItem), "nameField"));
        premium.Ext().Configure().ObjectClass(typeof(Order)).ObjectField("idField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Order), "idField"));
        premium.Ext().Configure().ObjectClass(typeof(Order)).ObjectField("nameField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Order), "nameField"));
        premium.Ext().Configure().ObjectClass(typeof(Creative)).ObjectField("idField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Creative), "idField"));
        premium.Ext().Configure().ObjectClass(typeof(Creative)).ObjectField("nameField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Creative), "nameField"));
        premium.Ext().Configure().ObjectClass(typeof(Company)).ObjectField("idField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Company), "idField"));
        premium.Ext().Configure().ObjectClass(typeof(Company)).ObjectField("nameField").Indexed(true);
        premium.Ext().Configure().Add(new UniqueFieldValueConstraint(typeof(Company), "nameField"));
        premium.Ext().Configure().ObjectClass(typeof(LineItemCreativeAssociation)).ObjectField("lineItemIdField").Indexed(true);
        premium.Ext().Configure().ObjectClass(typeof(LineItemCreativeAssociation)).ObjectField("creativeIdField").Indexed(true);

        premium.Commit();

    }

問題は、このクエリには時間がかかり、数百から数千の結果しか得られないことです。どのオブジェクト ストアにも 40,000 を超えるアイテムが含まれないようにする必要があります。私は何を間違っていますか?

        var creatives = from Creative c in original.Query<Creative>()
                        join Company co in original.Query<Company>()
                            on c.advertiserId equals co.id
                        join LineItemCreativeAssociation lica in original.Query<LineItemCreativeAssociation>()
                            on c.id equals lica.creativeId
                        join LineItem li in original.Query<LineItem>()
                            on lica.lineItemId equals li.id
                        join LineItem newLI in premium.Query<LineItem>()
                            on li.name equals newLI.name
                        join Company newCO in premium.Query<Company>()
                            on co.name equals newCO.name
                        from Creative newC in premium.Query<Creative>()
                            .Where(o=>o.name == c.name).DefaultIfEmpty()
                        where newC == null
                        select new { creative = c, newCompany = newCO };
4

1 に答える 1

1

遅さを説明できるコードに関するいくつかの質問/問題:

  1. 開いているデータベースでインデックスを構成しようとしているようです。これは機能しません (このページを確認してください)。

  2. クエリで original.Query() を呼び出すと、db4o はタイプ X (およびサブタイプも) のすべてのオブジェクトを返し、次に LINQ for Objects をクイックインします。この方法でクエリ メソッドを使用しないでください。db4o LINQ 実装が使用されます。代わりに(これははるかに高速になるはずです)。

私の推測では、結合を使用できるようにするためにそれを行っているということです (db4o LINQ 実装ではサポートされていないため)。db4o LINQ 実装を使用するには、クエリを複数の単純なクエリに分割し、各クエリの結果を結合する必要があります。

お役に立てれば。

于 2012-08-11T20:59:11.580 に答える