DocValues
Lucene4.0 から導入されたカラム指向のデータ構造です。
公式ドキュメントによると
facet,sort,groupingのパフォーマンスが高速化するとあります。
今回はその中のsortについて検証します。
調査に使ったインデックス
前回と同じです
Solrのバージョン
5.5.2
調査したパターン
インデックスが100万件(optimize済み)の状態で調査をおこないます。
DocValuesの有り無しで検証するのですが、検索だけした場合と、インデックスの更新をかけながら検索した場合のパフォーマンスも検証します。
これはSolrCloud環境において検索と更新の負荷が同時にかかることを想定してのことです。
検索のみの場合
パフォーマンスに差が出やすいように多重ソートにしました。
- DocValues=false
q=*:*&wt=json&indent=true&start=0&rows=10&fl=*,score&sort=sort_int1 desc,sort_int2 asc,sort_int3 desc,sort_int4 asc,sort_int5 desc
- DocValues=true
q=*:*&wt=json&indent=true&start=0&rows=10&fl=*,score&sort=sort_doc_val_int1 asc,sort_doc_val_int2 desc,sort_doc_val_int3 asc,sort_doc_val_int4 desc, sort_doc_val_int5 asc
Solrのキャッシュが無い状態で比較するため、毎回リロードをして実施しています。
処理時間(ミリ秒)1回目 | 処理時間 2回目 | 処理時間 3回目 | |
---|---|---|---|
DocValues=false | 1534 | 1460 | 1268 |
DocValues=true | 52 | 61 | 57 |
元々Solrの検索はキャッシュが効いていない状態ではパフォーマンスが良くない印象でしたが、DocValuesがあるフィールドに対してはかなりのパフォーマンスが出ています。
更新 + 検索の場合
この検証のパターン2で更新をかけつつ検索リクエストもおこないました。
クエリは120パターン用意しています。
詳細はgitに上がっています。
平均(ミリ秒) | 分散 | |
---|---|---|
DocValues=false | 66 | 120.7 |
DocValues=true | 67 | 19 |
平均はほぼ変わりませんでしたが、DocValues有りの方が分散がかなり小さくなっています。
Solr Adminで確認したところ、DocValues=falseの時だけfield Cacheが生成されていました。
1度キャッシュが生成されると、DocValuesが無くても高速に処理できるようです。
ただし、Commitが処理された段階でキャッシュが落ちるので、更新リクエストが常に飛び交うようなリアルタイム性の高いシステムではDocValuesの方が安定したパフォーマンスが出せそうです。
まとめ
DocValuesを使うことでキャッシュが無くても安定したパフォーマンスが出せることが分かりました。
ここで新たな疑問として、DocValuesを付けることでインデキシングのパフォーマンスやインデックスサイズがどのように変化していくのが気になってきます。
また、5.5.2では指定できないようですが、DocValuesをメモリ上に保持するdocValuesFormat="Memory"というオプションもあるため、DocValuesを使ったフィールドのパフォーマンスはさらに良くなりそうです。