0

Appstatsを有効にしてアプリケーションのプロファイリングを行った後、どうにかしてコストを削減する方法を見つけようとして、私はパニックに陥りました。リクエストあたりのコストの多くはクエリによるものだったので、クエリをできるだけ排除するように努めました。

たとえば、特定の日付Xの後にユーザーのStatusUpdatesを取得したいというクエリが1つありました。クエリを使用して、次のものをフェッチしstatusUpdates = StatusUpdates.query(StatusUpdates.date > X)ました。

そのため、システムの裏をかくことでクエリを回避できると思いましたが、読み取りコストを下げるために、書き込みコストが高くなります。ユーザーがステータスを書き込むたびに、そのステータスのキーをユーザーのリストプロパティに保存すると思いました。したがって、クエリを実行する代わりに、を実行しますndb.get_multi(user.list_of_status_keys)

問題は、これら2つのアプローチのシステムの違いは何ですか?確かに、2番目のケースではクエリを回避しますが、ここでは舞台裏で何が起こっているのでしょうか。キーを収集している2番目のケースで私が行っているのは、GAEがクエリで行ったであろう手動のインデックス作成を行っているだけですか?

一般に、get_multi(keys)とクエリの違いは何ですか?どちらがより効率的ですか?どちらが安価ですか?

4

2 に答える 2

2

請求に関するドキュメントを確認してください。

https://developers.google.com/appengine/docs/billing

それはかなり簡単です。読み取りは$0.07/ 100,000、スモールは$ 0.01 / 100kなので、スモールを実行します。

クエリは1読み取り+1スモール/エンティティ取得は1読み取りです。クエリで複数のエンティティを取得する場合は、キーからエンティティを読み取るよりもクエリを実行する方が安価です。

クエリもおそらくより効率的です。getを実行することの唯一の利点は、完全に整合性があることです(クエリは最終的に整合性があります)。

于 2012-09-19T02:44:05.257 に答える
1

キーだけでは何もできないため、キーを保存してもクエリは実行されません。それでも、ステータスオブジェクトをメモリからフェッチする必要があります。また、Statusオブジェクトの日付を照会するため、すべてのStatusオブジェクトをメモリにフェッチし、それらの日付を自分で比較する必要があります。クエリを使用する場合、appengineは必要な日付のステータスのみをフェッチします。フェッチが少ないため、読み取りコストが低くなります。

これは基本的にあなたがここで提起したのと同じ質問なので、私がそこで与えた答えを見てみることをお勧めします。

于 2012-09-18T22:57:32.953 に答える