1

ドキュメント コレクション「items」、「dictionary1」、「dictionary2」を持っている

collection "items" have 50000 records, like
{
label:"..."
dict1: "dictionary1/33333"
dict2: "dictionary2/44444"
....
}

辞書に参加すると

FOR item IN items
LET dictname = FIRST(FOR d IN dictionary1 FILTER d._id == item.dict1 RETURN d.name)
RETURN { _id: item._id, name: item.name, dict: dictname }

クエリの実行時間 ~ 150ms は、この単純なタスクには多すぎます。実験のために、私は 1 つの _id に対して dict を強制しています

FOR item IN items
LET dictname = FIRST(FOR d IN dictionary1 FILTER d._id == "dictionary1/10000" RETURN d.name)
RETURN { _id: item._id, name: item.name, dict: dictname }

クエリ実行時間 ~ 130ms

また、試したDOCUMENT機能

FOR item IN items
LET dictname = DOCUMENT("dictionary1", "dictionary1/10000")
RETURN { _id: item._id, name: item.name, dict: dictname.name }

クエリ実行時間 ~ 1500ms :((

コレクションからの単純な読み取り:

FOR item IN items
RETURN { _id: item._id, name: item.name }

クエリ実行時間 ~ 30ms

そのため、結合として_id 50000回同じドキュメントを取得すると、結果はキャッシュされません。1 つのコレクションにコンテンツが重複しているバリアントは役に立ちません。今、私はロジックをクライアント側に移動し、メモリ内のすべての辞書を選択し、クエリの後に結合し、最大 60 ミリ秒かかりますが、この方法は好きではありません。間違っています。

短時間で結合された辞書(80%同じ_id)で結果を得る方法はありますか?

4

1 に答える 1

1

dictionary1外側のループでループするfor eachに一致する項目があることが確実な場合は、items次のような単純な等結合にクエリを簡略化できます。

FOR item IN items
  FOR d IN dictionary1 
    FILTER d._id == item.dict1
    RETURN { _id: item._id, name: item.name, dict: d.name }

これにより、相関サブクエリと関数呼び出しが不要になります。dictionaryただし、その結果は、それぞれに一致するエントリがある場合にのみ、元のサブクエリ ソリューションと同等になりますitemdictionaryのエントリがない場合item、等結合クエリは単純にそれを抑制します。

にエントリがあるかどうかが不明でdictionary1、一致しない場合に s を返したい場合nullは、サブクエリ ソリューションを次のように簡略化できます (これにより、 への関数呼び出しが削除されますFIRST)。

FOR item IN items
  LET sub = (FOR d IN dictionary1 
    FILTER d._id == item.dict1
    RETURN d.name
  )
  RETURN { _id: item._id, name: item.name, dict: sub[0] }

それとは別に、結合する_key代わりにアトリビュートを結合すると、 よりも生成が短く複雑では_idないため、わずかなスピードアップが得られる場合があります。ただし、辞書コレクション名の接頭辞なしで結合値を格納する必要があります。_key_iditems

上記の提案は、桁違いの実行時間の改善を提供するものではありませんが、役立つ場合があります。

于 2015-10-20T13:07:14.103 に答える