2009年9月17日木曜日

GAE/Jでのインデックスの削除方法が分からない

検索するクエリを多く書いていくと、インデックスが増えていく。

GAE/Jでエンティティを抽出するときは、直接BigTable上のエンティティにフィルタリングしにいくのではなく、別途作成されたインデックスに対してフィルタリングを行う、という仕様になっているらしい。
参考:Java データストアのインデックスの設定 - Google App Engine - Google Code

インデックスが増加していくことは仕方ないことなのか、パフォーマンスなどのことを考えて、なるべくインデックスは増やさない方がいいのか、調査する。

すると、やはりGAE/Jでは==などの条件指定に限り、そのほかの条件による絞込みやソートはJavaのロジック側で実装した方が無難らしい。
参考:ローカルでは動作するが、GAE/J環境でエラーになってしまう - Slim3 User Japan | Google グループ

エンティティに変更が加えられるたびにインデックスが更新されるというシステムは、今後エンティティ量が増えていったとき、クエリに対してすばやく結果を返せるメリットもあるが、インデックスを更新するという作業の頻度や量が増えていくというデメリットも考えられる。以前、ほしい結果を全てクエリだけで実現できないかと思っていたが、それは少々的外れだったみたい。クエリはシンプルに徹底した方がよさそう。よって、コードを整理し、必要なインデックスを最低限に絞ることにした。

と、インデックスを削除しようとしたら、「あれ、どうすればいいんだ?」とスタックする。削除するインターフェースは見当たらないし、調べてみても削除方法について述べられているドキュメントがぱっと見当たらない。

とりあえず、war/WEB-INF/datastore-indexes.xml及びwar/WEB-INF/appengine-generated/datastore-indexes-auto.xmlを一旦削除。

ローカルでサーバーを起動し、ユニットテストするなりしてクエリを発行させて、自動的にdatastore-indexes-auto.xmlを作成。その記述内容を元にdatastore-indexes.xmlを作成しGAE/Jサーバー側へデプロイする。→インデックス、変化なし。

念のため、autoGenerate="false"にし、強制的にdatastore-indexes.xmlを使うようにしても変化無し。以下はそのときのdatastore-indexes.xml。



    
        
        
    


datastore-indexes.xmlの中身を空にしてデプロイしてみたが、それでも変化なし。


appengineのbinに含まれているappcfgコマンドを使ってみる。「0% Uploading index definitions.」ってことはインデックスの更新は一切行われなかったということか。よって削除されず、これでも変化なし。
C:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.2.5.v200909021031\ap
pengine-java-sdk-1.2.5\bin>appcfg.cmd update_indexes "C:\Documents and Settings\
xxx\workspace\myapp\war"
Reading application configuration data...
Beginning server interaction for myapp...
0% Uploading index definitions.
Success.
Cleaning up temporary files...
現在のインデックスに存在しない指定が含まれていた場合はインデックスが新規に作成されるが、一度作成されたインデックスを含まないような記述をdatastore-indexes.xmlに加えても、削除はされないのか?!・・・もしれないorz

「今出来るベストのことは、それらのインデックスを無視することだ」といっている会話もあったが、う~ん、結局無視するしかないのか?!
参考:Delete useless Entity and Indexes - Google App Engine for Java | Google グループ

キモチワルイ・・・。しかも実際には使用していないインデックスだが、エンティティが増えるたびにその未使用のインデックスの更新も同時に行われるということで、ムダだ。

また、ちなみに自分の環境だと、datastore-indexes-auto.xmlがmyapp/war/WEB-INF/appengine-generated/ではなく、warの外、つまりmyapp/WEB-INF/appengine-generated/の下に常に作成されるのが不便。いちいちコピペしなくてはならない。設定の問題?これもキモチワルイ・・・。