GAEの課金が大きくなったその対策の一つとして余計な index を作らないと言うのが有るのだが Single index はデフォルトで作られちゃうので各項目に設定しなければならない。

Slim3ならアノテーションでやって貰えるけど低レベルAPI だとソースの setProperty() を setUnindexedProperty() に変更しないといけない。

で、これって datastore-indexes.xml で出来ないのかと思って調べたがどうやら 出来ないらしい。

つーか、良く考えたら datastore-indexes.xml のちゃんとした仕様って 読んだこと無いわ orz
しかも、ググってもなかなか出て来ない。 結局 SDK の中に DTD を発見。

<!ELEMENT datastore-indexes (datastore-index)*> <!ATTLIST datastore-indexes autoGenerate (true|false) #REQUIRED> <!ELEMENT datastore-index (property)*> <!ATTLIST datastore-index ancestor CDATA #REQUIRED kind CDATA #REQUIRED> <!ELEMENT property (#PCDATA)> <!ATTLIST property direction (asc|desc) #REQUIRED name CDATA #REQUIRED>

これを見る限り Composite index の設定しか無さげ。

対策検討中にたまたま見付けたのが以下のページ

  • Single Property Indexを作らないとComposite Indexも作成されない?
    http://d.hatena.ne.jp/koherent/20100801/1280643622

うーん、逃げ道無し。

ちなみに single index 全部無くすとどのくらい効果があるかと言うと 項目数11個で Write ops が 22 -> 2 になる。

実際には全部消せないけどケースバイケースで効果絶大な場合もありそう。