2009年11月29日日曜日

Google App Engineで不要なインデックスを削除する方法

Google App Engineのストレージシステム(Datastore)は一般的なRDBMSのようにインデックスを貼ることが可能です。
(というか、インデックスを貼っていないクエリを本番環境で発行すると例外が投げられます)

以下、Python Datastore APIの話


インデックスの設定はきわめて簡単で、基本的にはすべて自動で行われます。

開発 Web サーバーを使用している場合、インデックス設定は容易に実行できます。必要なインデックスが存在しないクエリを実行すると、操作は失敗しませんが、逆に開発 Web サーバーがクエリを成功させるために必要なインデックス設定を生成します。アプリケーションのローカルテスト時に、アプリケーションが作成する可能性のあるクエリ(種類、祖先、フィルタ、並び替え順序のすべての組み合わせ)をすべて呼び出す場合、生成されたエンティティはインデックスの完全なセットを表します。テストですべての可能性のあるクエリ形式を実行しない場合、アプリケーションをアップロードする前にインデックス設定を見直し、調整することもできます。
クエリとインデックス - Google App Engine

例えば下のような場合
from google.appengine.ext import db

class Person(db.Model):
nickname = db.StringProperty()
age = db.IntegerProperty()
query = Person.all()
query.filter('nickname =', 'Foo')
query.('age =', 30)
query.fetch(10)

開発環境で上のコードを実行すると、index.ymlに次のようなインデックスが自動で設定されます。
- kind: Person
properties:
- name: age
- name: nickname

上のモデルにaddress(住所)を追加するとどうなるでしょう
class Person(db.Model):
nickname = db.StringProperty()
age = db.IntegerProperty()
address = db.StringProperty()

query = Person.all()
query.filter('nickname =', 'Foo')
query.('age =', 30)
query.('address =', 'Tokyo')
query.fetch(10)

index.ymlに新しいインデックスが追加されます。
- kind: Person # (1)
properties:
- name: age
- name: nickname


- kind: Person # (2)
properties:
- name: address
- name: age
- name: nickname

では、最初に設定したインデックス(1)を削除するにはどうすればいいでしょう?

index.ymlから該当部分を消しただけでは、デプロイしてもインデックスが削除されることはありません。
index.yaml からインデックスを変更または削除する場合、元のインデックスは App Engine から自動的には削除されません。そのため、新しいインデックスの作成中に古いバージョンのアプリケーションを実行させることや、新しいバージョンで問題が発生した場合、すぐに古いバージョンに戻すことができます。
使用していないインデックスの削除

index.ymlから使わなくなったインデックスを消去して、appcfg.pyを叩けばインデックスを削除することができます。
古いインデックスが不要になった場合は、次のコマンドを使用して App Engine から削除できます。
appcfg.py vacuum_indexes myapp/

このコマンドは、最近アップロードされたバージョンの index.yaml で指定されていない、すべてのアプリケーションのインデックスを削除します。
使用していないインデックスの削除

appcfg.py vacuum_indexesを叩くと削除候補のインデッックスを本当に削除するか確認してくるので、削除する場合は「y」を入力。
DashboardのDatastore - indexesのステータスがdeletingに変わります。


インデックスを削除してしまうとバージョンの互換性が失われる恐れがあります。
(先述したように、インデックスのないクエリを発行すると例外が投げられる)

ですのでインデックスを削除する際は十分に注意する必要があります。


関連エントリー:
Google App Engineアプリでモデルを変更してデプロイするとエラーになることがある

0 件のコメント: