4

頻繁に実行されるクエリがあり、おそらく同じ結果が得られるとします。

以下を使用するのは正しいですか?

for key in qry.iter(keys_only=True):
    item = key.get()
    #do something with item

以下よりもパフォーマンスが向上します:

for item in qry:
    #do something with item

最初の例では、クエリはキーのみをロードし、以降の呼び出しkey.get()はNDBのキャッシュメカニズムを利用しますが、例2は常にストアからエンティティをフェッチするためですか?それとも私は何かを誤解しましたか?

4

2 に答える 2

7

2番目の形式のパフォーマンスが向上するかどうかは疑問です。値がキャッシュにない可能性が常にあり、複数のエンティティが返されると仮定すると、複数のラウンドトリップが発生します。それはすぐに遅くなります。

より良いアプローチは、実際にhttp://code.google.com/p/appengine-ndb-experiment/issues/detail?id=118に示されているものです-ndb.multi_get(q.fetch(keys_only = True))を使用します。ただし、キャッシュのヒット率が低すぎると、それでもさらに悪化します。これはこの問題で広く議論されています。

于 2012-04-02T03:57:13.310 に答える
1

AFAIK内部的には、ndbはクエリを含むすべてをキャッシュするため、違いはありません。それぞれで他のことを行う場合は、非同期APIを試してください。貴重な時間を節約できます。編集:さらに、ndbが事前にクエリを知っている場合は、それらをプリフェッチすることもできます。

私はこれを6か月前に読んだので、現在の動作が何であるかわかりません。

于 2012-04-01T15:08:10.560 に答える