マテリアライズドビュー: 諸刃の剣になり得る理由
このガイドは、コミュニティミートアップで得られた知見をまとめたコレクションの一部です。より実践的なソリューションや知見については、特定の問題別に閲覧できます。 大量のパーツがデータベースのパフォーマンスを低下させていませんか?Too Many Parts コミュニティインサイトガイドを参照してください。 マテリアライズドビュー についてさらに詳しく学びましょう。
10倍ストレージアンチパターン
実際の本番環境で発生した問題: 「マテリアライズドビューを使っていました。生ログテーブルは約20GBでしたが、そのログテーブルを元にしたビューが190GBまで膨れ上がり、生テーブルのほぼ10倍のサイズになってしまいました。これは、属性ごとに1行ずつ作成しており、各ログが最大で10個の属性を持つ可能性があったために起きました。」
ルール: GROUP BY によって削減される行数よりも多くの行が生成される場合、それはマテリアライズドビューではなく、高コストなインデックスを作っていることになります。
本番環境マテリアライズドビューの健全性検証
このクエリを使うと、マテリアライズドビューを作成する前に、それがデータを圧縮するのか、あるいは肥大化させてしまうのかを予測できます。実際のテーブルとカラムに対して実行し、「190GB への肥大化」シナリオを回避してください。
このクエリで分かること:
- 低い集約率 (<10%) = 良い MV であり、圧縮効果が大きい
- 高い集約率 (>70%) = 悪い MV であり、ストレージ肥大化のリスクが高い
- ストレージ倍率 = MV のサイズがどれだけ増減するか
マテリアライズドビューが問題になるとき
監視すべき警告サイン:
- 挿入レイテンシの増加(以前は 10ms だったクエリが 100ms 以上かかるようになる)
- "Too many parts" エラーの発生頻度が増加する
- 挿入処理中の CPU 使用率のスパイク
- これまで発生していなかった挿入タイムアウト
system.query_log を使用してクエリ実行時間の推移を追跡することで、マテリアライズドビューを追加する前後の挿入パフォーマンスを比較できます。
動画資料
- ClickHouse at CommonRoom - Kirill Sapchuk - 「マテリアライズドビューに過度に熱狂した」事例と「20GB から 190GB への爆発的増加」事例の出典