grn_ts: シーケンシャルアクセス向けの改善
以下のようなクエリを試すと,実行時間が想定より長くなることがわかりました.
select Table --filter 'TextCol == "A"'
少し調査すると,フィルタリング以外,具体的にはカラムから値を取り出すのに時間がかかっていることがわかりました.次に,ソースコードを確認したところ,値をひとつ取り出す毎にアトミック命令で参照カウントをインクリメント・デクリメントしていて,それが大きなコストになっていそうなことに気づきました.
そこで,次の値が直前の値と同じセグメントに配置されているときは,参照カウントのデクリメント・インクリメントを省略できるように,ちょっとしたキャッシュ機能を導入してみました.その結果, 1,000 万レコードに対するフィルタリングで 0.2 〜 0.4 秒短縮することができました.
改善前の実行時間が 0.5 〜 0.7 秒くらいなので,それなりに大きな改善になっています.ただし,長くて 12 bytes までの Text しか格納されていない状況で,差がはっきり出るような設定です.