デザインパターンというものがある。classをデザインするときのパターンを汎化してまとめたものである。多くのデザインがこのパターンのどれかに近いもので実現できる。
データアクセスパスも同じようにパターンを型として理解しておけば、その型をベースに多様な状況に対応できる。
下記にデータアクセスをパターン化して型として整理する。
概要(型の使い方)
- 下記”1.アクセスパターン”でどのパターンに該当するか判断する。
- 下記”2.IO時間の計算”とアクセスパターンから処理時間を算出する。
- RDB等でメモリヒット率の影響が大きい場合は、下記3のメモリヒット率を考慮して算出した処理時間を調整する。
- 同様に下記4、5、6、7を考慮して算出した処理時間を調整する。
1.アクセスパターン
- 10%以上取得する場合
- フルスキャン
- 10%以下の場合
- クラスタ化あり
- レンジスキャン
- ランダムアクセス+レンジスキャン
- クラスタ化なし
- ランダムアクセス
- クラスタ化あり
参考)サイジング:ストレージ
2.IO時間の計算
- フルスキャン
- データサイズ ÷ シーケンシャルIO性能
- レンジスキャン
- ヒット件数÷ ブロックサイズ × シーケンシャルIO性能
- ランダムアクセス
- ヒット件数× ランダムIO性能
参考)サイジング:ストレージ
3.メモリヒット率を考慮
- インデックスアクセスはヒット率80%として計算(つまり処理時間は処理時間×0.2となる)。
4.JOINの場合
下記のようなJOINのパターンが有り得る。それぞれのテーブルのヒット件数をパラメータとして上記2から算出する。
- フルスキャン → フルスキャン
- インデックスアクセス → フルスキャン
- フルスキャン → インデックスアクセス
5.CPU負荷を検討する場合
下記のようにCPUが処理するレコード件数を考慮する。
- where句で処理するレコード件数
- 関数で処理するレコード件数。
6.ソート負荷の考慮
- インデックスを使ってorder byの並びでデータを取得できる場合はソート負荷を0にできる
- メモリが十分な場合
- ソート負荷はソート対象のレコード件数に依存。コストはCPU負荷。
- メモリが不十分な場合
- マージソートのIO負荷を考慮
参考)ETLのサイジング:メモリ の ”メモリが不足した場合はどうなるか?”
7.同時アクセスの待ち時間を考慮する場合
参考)システム設計で待ち行列理論を活用する
前提
- 基本的な考え方の理解を目的としているため、インデックス部のアクセス時間や、ディスクキャッシュヒット率等の詳細はここでは考慮しない。