目的は、非常に頻繁に実行され、毎回数百のキーを db.get() する必要があるコードの CPU コストと応答時間を削減することです。
これでも機能しますか?
エンティティのサイズを縮小すると、数百のキーを持つ db.get() の API 時間がほぼ直線的に短縮されると期待できますか? 現在、エンティティには次のデータが添付されています: 9 つの文字列、9 つのブール値、8 つの整数、1 つの GeoPt、2 つの DateTime、1 つのテキスト (平均サイズ ~100 バイト FWIW)、1 つの参照、1 つの StringList (平均サイズ 500 バイト)。目標は、このデータの大部分を関連するクラスに移動して、メイン モデルのコア フェッチを高速化することです。
機能する場合、どのように実装されていますか?
リファクタリング後も、既存のエンティティをフェッチするのと同じ高コストが発生しますか? ドキュメントには、モデルのすべてのプロパティが同時にフェッチされると記載されています。ユーザーが待機している間に、古い不要なプロパティが引き続き RPC 経由で転送されますか? つまり、エンティティの読み込み時間を短縮したい場合、古いエンティティを新しい定義のエンティティに移行する必要がありますか? もしそうなら、エンティティを re-put() するだけで十分ですか、それともまったく新しいキーで保存する必要がありますか?
例
検討:
class Thing(db.Model):
text = db.TextProperty()
strings = db.StringListProperty()
num = db.IntegerProperty()
thing = Thing(key_name='thing1', text='x' * 10240,
strings = ['y'*500 for i in range(10)], num=23)
thing.put()
Thing を再定義して合理化し、新しいバージョンをプッシュするとします。
class Thing(db.Model):
num = db.IntegerProperty()
そして、私はそれをもう一度取得します:
thing_again = Thing.get_by_key_name('thing1')
このエンティティのフェッチ時間を短縮しましたか?