インデックスはビューの定義に基づき、Couchbase Serverによって作成されますが、これらのインデックスの更新はデータが挿入される際にではなく、データをクエリする際に制御できます。問い合わせの時にインデックスが更新されるかどうかはstale
パラメータで制御することが可能です。
stale
パラメータにかかわりなく、一度ドキュメントがディスクに永続化されると、ドキュメントはシステムによってインデックスされます。ドキュメントがディスクに永続化されていない場合、stale
の使用はこのプロセスを強制しません。observe
操作を使用すると、いつドキュメントがディスクに永続化され、そして/もしくはインデックスが更新されたかを監視することができます。
ビューはまた、ドキュメントの変更、あるいは間隔カウントに応じて自動的に更新することができます。「インデックスの自動更新」を参照してください。
stale
は3つの値がサポートされています。
stale=ok
インデックスは更新されません。指定したビューのインデックスが存在する場合、現在のインデックス内の情報に対するクエリの結果が返却されます。
存在するインデックスを更新せずに使用するので、この設定はクエリに対する応答時間がもっとも短くなります。ただし、データベースに変更が加えられたドキュメントがビューに含まれている場合、不完全な結果を返すリスクがあります。
stale=false
クエリが実行される前にインデックスが更新されます。全ての更新された(そしてディスクに永続化された)ドキュメントがビューに含まれることを保証します。クライアントはクエリが実行される前に、インデックスが更新されるまで待つことになり、更新されたインデックスが有効になるまで、応答が遅延します。
stale=update_after
stale
パラメータが指定されていない場合、これがデフォルトの設定です。既存のインデックスがクエリに利用されますが、クライアントに結果が返却されたあと、インデックスは更新状態にマークされます。
インデックスエンジンは非同期処理です。これは、インデックスへの問い合わせは想定しない結果を提供することを意味します。たとえば、ドキュメントを更新して、すぐにそのドキュメントにクエリした場合、出力されるビューデータに新しい情報を取得できないかもしれません。これはその更新がインデックスされた時点でドキュメントの更新がまだディスクにコミットされていないからです。
これは、削除したあとさえも、その削除されたドキュメントがまだインデックスから削除されていないため、削除されたドキュメントがインデックスにまだ表示されるということも意味します。
両方のシナリオでは、ドキュメントの永続化状況の検証のためにクライアントからpersistto
の引数でobserve
コマンドを使用し、stale=false
を使用してビューの更新を強制すべきです。これはドキュメントがビューインデックス内で正しく更新されることを保証します。詳細については、Couchbase 開発者ガイドの監視の使用を参照してください。
同一のインデックスにアクセスする複数のクライアントがあるとき、インデックス更新処理とクライアントへ返却する結果は各クライアントが渡したパラメータとクライアントとサーバの相互作用する順番に依存します。
状況1
クライアント1がstale=false
でビューをクエリ
サーバがインデックスを更新するまで、クライアント1は待つ
クライアント1による再インデックスの処理中に、クライアント2がstale=false
でビューをクエリ
既存のインデックス処理がクライアント1の終了により開始されるまでクライアント2は待ち、クライアント2は更新されたインデックスを受け取る
状況2
クライアント1がstale=false
でビューをクエリ
サーバがインデックスを更新するまで、クライアント1は待つ
クライアント1による再インデックスの処理中に、クライアント2がstale=ok
でビューをクエリ
クライアント2は更新前のインデックスを取得
状況3
クライアント1がstale=false
でビューをクエリ
サーバがインデックスを更新するまで、クライアント1は待つ
クライアント2がstale=update_after
でビューをクエリ
クライアント1によるインデックス処理がまだ終了していない場合、クライアント2は更新前のインデックスを取得し、クライアント1によるインデックス処理が終了している場合、クライアント2は更新されたインデックスを取得し、再度インデックス処理を開始する
もし、複数のクライアントが情報が返される前にビューが更新されるようなリクエスト(stale=false
)をした場合、インデックスの更新はスタックしてしまいます。これにより、複数のクライアントがインデックスを更新、およびクエリし、その度にドキュメントとビューのバージョンが更新されることが保証されます。stale=update_after
クエリにより、すべての更新がクエリにアクセスされたあとで行われるので、スタックが発生しません。
シーケンシャルなアクセス
クライアント1がstale=okでビューをクエリ
クライアント2がstale=falseでビューをクエリ
ビューが更新されます
クライアント1がstale=okで再びクエリ
クライアント1は更新されたバージョンのビューを取得
上記のシナリオは、レコードの順序が各クエリで異なる可能性があり、複数のレコードに対してページング処理をしている場合に問題が起きる場合があります。