1

私のアプリケーションは現在、必要なすべての最適なインデックスを定義しています。しかし、ゆっくりとインデックスの爆発的な問題に悩まされ始めたので、ここで説明するように、戦略を切り替えて「ジグザグ」マージの使用を開始したいと思います。

私のエンティティContactには3つの並べ替え順序があります:

  • lastModifiedASC

  • fullNameUpperCaseASC + DESC

4つのフィルターがあります:

  • contactProfile

  • contactStatus

  • contactType

  • searchFields('startsWith ...'をエミュレートする不等式クエリ)

searchFieldsは特殊なケースです。これは、このように「startswith」をエミュレートするために使用するためです。

 query = query.filter("searchFields >= ", criteria.getSearchString().toUpperCase());
 query = query.filter("searchFields <= ", criteria.getSearchString().toUpperCase() + "\ufffd");

記事の説明に続いて、私は定義する必要があります

 (number of filters + 1) * (number of orders) = 5 * 3 = 15.
  • 私の主な問題!

以下の新しい定義は開発サーバーで機能するようですが、初めてではありません。初めてジグザグマージの新しい組み合わせを実行する必要がある場合でも、devserverはDatastoreNeedIndexExceptionをスローします。同じクエリを2回繰り返すと、クエリが実行され、期待される結果が返されます。これは、結果をページングするときにも発生します。次のページを初めてクエリすると、例外がスローされます。繰り返し作品。誰もがこの振る舞いを見たことがありますか?このdevserverの問題ですか、それとも何かが足りませんか?または、このインデックス作成は最初は不完全なのかもしれません...たとえば、devserverは、これらのフィルターを初めて組み合わせるときに、これがインデックスとして欠落していると文句を言います。

<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactProfile" direction="asc"/>
    <property name="status" direction="asc"/>
    <property name="fullNameUpperCase" direction="desc"/>
</datastore-index>

エンティティContactの新しいインデックス定義は次のとおりです。

<!-- SORT ORDERS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="lastModified" direction="desc" />
</datastore-index>
<!-- FILTER: SEARCHFIELDS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="asc" />
    <property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="desc" />
    <property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="lastModified" direction="desc" />
    <property name="searchFields" direction="asc" />
</datastore-index>
<!-- FILTER: CONTACTSTATUS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="asc" />
    <property name="status" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="desc" />
    <property name="status" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="lastModified" direction="desc" />
    <property name="status" direction="asc" />
</datastore-index>
<!-- FILTER: CONTACTTYPE -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="asc" />
    <property name="contactType" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="desc" />
    <property name="contactType" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="lastModified" direction="desc" />
    <property name="contactType" direction="asc" />
</datastore-index>
<!-- FILTER: CONTACTPROFILE -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="asc" />
    <property name="contactProfile" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="desc" />
    <property name="contactProfile" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="lastModified" direction="desc" />
    <property name="contactProfile" direction="asc" />
</datastore-index>
4

1 に答える 1

1

ソート順を結合されたインデックスの最後のプロパティに移動した後、機能しないという問題が修正されました。

だから例えば

<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="asc" />
    <property name="status" direction="asc" />
</datastore-index>

にならなければなりませんでした。

<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="status" direction="asc" />
    <property name="fullNameUpperCase" direction="asc" />
</datastore-index>

したがって、最後のプロパティはソート順です。

次に、seachFieldsは並べ替え順序と見なす必要があり、組み合わせを行う必要があります。インデックスは5つのソート順になります:

  • lastModified ASC

  • fullNameUpperCase ASC + DESC

  • searchFields ASC + DESC

3つのフィルター:

  • contactProfile

  • contactStatus

  • contactType

    (フィルターの数+ 1)*(注文の数)= 4 * 5=20インデックス。

完全に機能するリストは次のとおりです。

<!-- SORT ORDERS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="fullNameUpperCase" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="lastModified" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="searchFields" direction="desc" />
</datastore-index>
<!-- FILTER: CONTACTSTATUS -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="status" direction="asc" />
    <property name="fullNameUpperCase" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="status" direction="asc" />
    <property name="fullNameUpperCase" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="status" direction="asc" />
    <property name="lastModified" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="status" direction="asc" />
    <property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="status" direction="asc" />
    <property name="searchFields" direction="desc" />
</datastore-index>
<!-- FILTER: CONTACTTYPE -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactType" direction="asc" />
    <property name="fullNameUpperCase" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactType" direction="asc" />
    <property name="fullNameUpperCase" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactType" direction="asc" />
    <property name="lastModified" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactType" direction="asc" />
    <property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactType" direction="asc" />
    <property name="searchFields" direction="desc" />
</datastore-index>
<!-- FILTER: CONTACTPROFILE -->
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactProfile" direction="asc" />
    <property name="fullNameUpperCase" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactProfile" direction="asc" />
    <property name="fullNameUpperCase" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactProfile" direction="asc" />
    <property name="lastModified" direction="desc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactProfile" direction="asc" />
    <property name="searchFields" direction="asc" />
</datastore-index>
<datastore-index kind="Contact" ancestor="true" source="manual">
    <property name="contactProfile" direction="asc" />
    <property name="searchFields" direction="desc" />
</datastore-index>

PS:本番環境を新しいインデックスに移行する方法に関する追加の質問を削除しました。必要に応じて新しい質問を投稿します。

于 2013-03-06T15:13:04.963 に答える