SAP S/4HANAのテーブルパーティショニング
ACDOCA(ユニバーサルジャーナル:会計伝票)が10億件突破したので、テーブル分割(パーティショニング)について調べてみる。
行テーブル(row store):1.945GB
列テーブル(column store):21億件/パーティション
※SPS05以前は20億件/パーティション、少し緩和された(笑)
SAP HANA Administration Guide for SAP HANA Platform
Number of rows in each table |
Limited by storage size RS: 1,945 GB/sizeof(row), CS: 2,100,000,000 * number of partitions |
パーティション数の上限は16,000個なので、ちゃんとパーティション分割すれば事実上無制限(物理メモリサイズに制限される)と考えてよさそう。
パーティション化の一般的な説明
Table Partitioning(SAP HANA Administration Guide for SAP HANA Platform)
下記パーティショニング方法がサポートされてる。注意事項はほかのDBと似た感じ。
- Hash
- ハッシュ化する列に基づいて分割する方法
- テーブルの内容を考えずに20億件(SPS06以降は21億件)の制限を回避するならこの方法がおすすめ
- Round robin
- Range
- テーブルの範囲を指定して分割する方法
- テーブルの内容を理解していないとダメ。絶対。
んで、ACDOCAはどれを使えばいいの?という疑問は下記ノートに乗っている。
2044468 - FAQ: SAP HANA Partitioning
BELNR(伝票番号)をキーにしたHASH分割がおすすめだそうです。
パーティショニングテーブルはアプリケーションから透過的なので、アプリ側の改修は不要。範囲分割の場合は業務運用は考えたほうがいいかも。
で、いくつに分割すればいいの?という話ですが、あまり細かく分割すると、パーティションをまたいだときのオーバーヘッドがあるので、DBサーバのCPU/メモリリソースが増大するのでほどほどにが良いようで。主な副作用は下記の通り
- メモリのオーバヘッド
- トランザクションのデットロック
- CPU使用率増大によるパフォーマンス低下
逆に分割するメリットは下記の通り
- 列ストアに21億件以上のレコードを保存できる
- BW(OLAP)が早くなる(10.7億件以上になるとメモリ管理に影響がでるそうな)
- デルタマージが並列化される
ERP用途だとパフォーマンス改善は期待できなさそう。
ACDOCAについては、ベストプラクティスがノート化されています
2289491 - Best Practices for Partitioning of Finance Tables
使い方によっては会計年度や企業コードでの範囲分割もできるけど、DB管理が面倒になりがちなので、1パーティション10億件超えたら伝票番号を使ったHASHで分割していきましょう!ってことかな?