Solr Advent Calendar 2016 の4日目です。
アトミックアップデートとは
アトミックアップデート(atomic update)とはpartial updateとも呼ばれる機能で、特定のフィールドのみをピンポイントで更新する機能です。
JSONだと下記の形式でリクエストをします。
{
"id":"1",
"price":{"set":5000} //更新したいフィールド
}
アトミックアップデートの問題点
便利な機能ですが処理コストが高いというデメリットがあります。
アトミックアップデートはユニークキーで一度検索をおこない、更新対象のドキュメントから全てのフィールドを取り出して更新用のデータを生成し直します。
つまり、検索+データの生成+更新が発生することになります。
私も人づてでアトミックアップデートは遅いよと聞きつつも、どれだけ遅いのかは知らなかったので、通常の更新に比べてどれだけ更新速度に差が出るのかを調査しました。
調査に使ったインデックス
前回と同じです
Solrのバージョン
5.5.2
調査したパターン
インデックスが100万件(optimize済み)の状態から、1度の更新リクエストで1万件のデータを更新しました。
これを100回、計100万件を更新します。
この時に
- 全てのフィールドを揃えて更新
- sort_int1だけアップデート(set)で更新
とします。
また、どちらもcommitWithin=5000としました。
結果と考察
処理時間(秒) | |
---|---|
パターン1 | 152 |
パターン2 | 470 |
パターン2では通常の更新に比べて3倍以上時間がかかりました。
また、検索とフィールドの補完を行うため、インデックスの件数が多い場合やフィールドを大量に定義している場合などはさらに更新負荷は高くなりそうです。
まとめ
アトミックアップデートは通常の更新に比べてかなり更新速度が落ちることが分かりました。
バッチ更新などで、大量の更新リクエストを生成する場合は長時間更新負荷がかかりっぱなしの状態になりそうです。
Solr6.3系からはアトミックアップデートのパフォーマンス改善を目的としたSOLR-9592が入っているので、そちらのパフォーマンスを期待したいところです。