SAP*とDDICどっちが必要?

インフラ寄りのSAPのこととか

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
    • パーティションに順番にエントリーを割り当てていく方法
    • よっぽどの理由がない限りはHashパーティションを使う方がいいらしい。("Hash partitioning is usually more beneficial than round-robin partitioning for the following reasons")
  • 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で分割していきましょう!ってことかな?