2011-09-17 10 views
0

AppEngineのドキュメントでは、「キーを返すクエリは、完全なエンティティを返すクエリよりも速く、CPUのコストが安い」ということに注意してください。AppEngineのキーによるクエリと反復処理

データストアから複数のオブジェクトをフェッチして繰り返し処理する方が望ましいでしょうか?対

query = Person.all() 
query.filter('name = ', person_name)     
query.order("__key__") 

for p in people: 
    #read properties of the person object 
    print p.name 

答えて

2

通常のクエリは、基本的に最初のスニペットが行う操作を1つのRPC内でのみ実行します。エンティティが必要な場合は、単にキーを要求し、エンティティを自分で取得するよりも、単に要求する方が効率的です。

効率性を考慮する必要があることの1つは、クエリオブジェクトを反復処理することです。これを行うと、基礎となるRPC層が20のバッチでデータストアの結果をフェッチし、多くの不要なRPCが発生します。必要な結果の数がわかっている場合は、クエリでfetch()results = Person.all().filter('name =', 'Joe').fetch(100)など)を呼び出す必要があります。この場合、1つのRPCしか実行されません。

Appstatsは、これらの種類のパフォーマンスの問題を発見して診断するための優れたツールです。

1

query_keys = Person.all(keys_only=True) 
query_keys.filter('name = ', person_name) 
query_keys.order("__key__") 

people = db.get(query_keys)             
for p in people: 
    #read properties of the person object 
    print p.name 

あなたがとにかくいっぱいエンティティを読んでいるように、その後、第二の方法は、最初の1、少なくともではない遅くなります。おそらくそれはより速くなります。なぜなら、それはより少ないAPI呼び出ししかないからです。

+0

私はエンティティ上で2つのプロパティ(すべてではない)を読んでいます。 –

+0

btw、エンティティから2つのプロパティを取得するには、GAEはすべてのプロパティを持つこのエンティティをストレージからロードする必要がありますか? –

1

キーのみのクエリは、プロパティを持つエンティティではなく、キーを提供します。最初の例では、pには.nameがありません。また、キーの順序は暗黙的です。エンティティからプロパティを取得する場合、キーのみのクエリは必要なものではありません。エンティティを照会する必要があります。現在、すべてのプロパティを下回る方法はないので、データモデリングを考慮してください。

ここでは3番目の方法があります。それはあなたの2番目の断片と同等に機能します。あなたは自分のキーを照会するよりも高速になるだろうし、その後、それらのキーに対応するエンティティをフェッチしているエンティティに対して直接照会、このアプローチまたは2番目のスニペットを使用するかどうか

people = Person.gql("WHERE name=:1", person_name) 
for person in people: 
    print person.name 

+0

'p'は' people'の要素で、 'db.get'を使って取得した名前なので、名前を持ちます。 –

+0

keys_only = True? –

+0

Line 5。彼はキーに対応するエンティティを取り出し、それらを反復処理します。 –

関連する問題