2012年9月2日日曜日

[AppEngine] データストアの Quota と Index

前回、調子に乗ってデータストアのテストをしていたらあっという間に、無料分の Quota の制限に達してしまった。 AppEngine 管理コンソールで詳しく見てみる。

「Quota Details」 画面で見てみると、引っかかったのは「Datastore Write Operations」 の 「0.05 Million Ops / 24 hour」。

500 個ずつ Entity を作ったり消したりしていたのだがそれでも到底 50000 件はいっていないはず、と思っていたらよく見るとこういうことになっている。

ResourceDaily Quota
Datastore Entity Put Ops 4,376
Datastore Entity Delete Ops 4,254
Datastore Index Write Ops 43,274

確かに、4000 個くらいは作ったり消したりしたと思う。でも実際には Put/Delete Ops の合計の5倍の「Index Write Ops」 がカウントされている。

別に明示的にインデックスを作ったわけではないのにどういうこと?
解せないので調べてみた。


インデックスの自動生成


どうもデータクラス(カインド)の各プロパティごとに自動的にインデックスが作成されるらしい。 それも昇順・降順と2つ作成されるとのこと。

データストアの 無料 Quota 制限がリセットされたので早速やってみよう。
前回はテストの段階でプロパティの増減もやっていたので正確な数値がわからないので、 改めて id、no、name の3属性で1件ずつデータの追加/削除をしながら管理ツールの Quota Detail の状況を確認してみる。

結果:
  • 追加処理:
    Datastore Entity Put Ops: +1
    Datastore Index Write Ops: +5
  • 削除処理:
    Datastore Entity Delete Ops: +1
    Datastore Index Write Ops: +5

追加・削除ともにインデックス更新は5件ずつ実行されている。
id で1つ、それ以外が2つづつということだろうか。
単一プロパティに対するインデックスは AppEngine の管理コンソールの 「 Database Indexes 」 に表示されないので正確なところはわからないのだが大体こんなところだろうと思う。

String 型属性を一つ増やして再度確認。予想通り、追加/削除両操作ともに「Datastore Index Write Ops」は7件ずつ増加した。



ということで 追加・削除時のインデックスの更新数が (多分)id 以外のプロパティ数×2+1で発生するということが分かった。実際のデータではプロパティ数はかなり多くなると思われるので、追加/削除が多いと無料分の Quota はあっという間に使い尽くしてしまうと思う。有料にしたとしてもここでかなり課金が発生する可能性が高い。
AppEngine のデータストアでは、インデックスがないと Query で検索できないのでインデックスを作らないわけにはいかない。アプリケーションの構成から検索に使う属性のみインデックスを使うようにしないとインデックス更新が大量に発生してしまう。

現時点では JDO でプロパティごとにインデックス要否を指定する方法は不明。
Low Level API ではオブジェクトをストアするごとにどのプロパティをインデックスに登録するか指定できるらしい。
Slim3 という AppEngine 向けのフレームワークであればプロパティごとにインデックスを作るかどうかの指定ができる( Slim3 Datastore > Defining Data Classes > Unindexed Properties )。


0 件のコメント:

コメントを投稿