20 件の結果を取得する keys_only クエリを実行しています。
result_keys, cursor, more = ActivityIndex.query(cls.followers == key)\
.order(-cls.date_created)\
.fetch_page(num_results,
start_cursor = cursor,
keys_only=True)
次に、 activityIndex オブジェクトの親を取得します。
keys = []
for k in result_keys:
for pair in k.parent().pairs():
keys.append(ndb.Key(pairs=[pair]))
activities_related = ndb.get_multi(keys)
キーごとにオブジェクトのバッチを取得していたので、これは速いと思いました。ただし、appstats docsdatastore_v3.Next
によると、クエリは call のようで、これは「悪い」ものであり、実行時間のかなりの部分を占めています。
不要な Next 呼び出しを避けることで、アプリの速度が向上する可能性があります。
上記のクエリの Appstats (get_multi 呼び出しを使用)
上記のクエリの Appstats ですが、get_multi を呼び出していません (next() が応答するまでの短い時間)。
datastore_v3.next()
を呼び出すときに、呼び出しの実行に時間がかかるのはなぜget_multi()
ですか? get_multi が返す結果の数に依存しますか? get_multi で返されるオブジェクトの一部にはリスト プロパティ (リスト内の最大 10 アイテム) がありますが、これはパフォーマンスに影響しますか?
この問題を回避するには、設計を変更し、タスクレットで必要なエンティティをフェッチする方がよいでしょうか? 他の提案はありますか?
編集:
私がやろうとしていることについてのもう少しの情報: アプリケーションにアクティビティ ストリームがあり、すべてのユーザー アクティビティが表示されます。たとえば、Rob が画像にコメントしたなどです。アクティビティの説明と表示する情報を構築するオブジェクト。これらすべてのオブジェクトのキーを の親として設定しActivityIndex
ました。したがって、上記のクエリから、ndb.get_mult(keys)
Activity、User、および Picture オブジェクトを取得します。キー リストには 50 個以上のキーが含まれている可能性があるため、これが長いdatastore_v3.Next
呼び出しの原因である可能性があります。