SAP ERP における列ストア機能のカスタマーエクスペリエンス

執筆者: Martin Merdes

このポストは、2017 年 12 月 18 日に投稿された Customer Experience with Columnstore on ERP の翻訳です。

 

数か月前に、SAP はMSS_CS_CREATE レポートをリリースしました。このレポートプログラムにより、すべてのSAP ERP のテーブルに対して非クラスター化列ストアインデックス (NCCI) を作成できるようになります。詳しくはこちらのブログ記事 (英語) をご覧ください。

複数のお客様による検証の結果、この機能を使用することで、大規模な集約を行うレポート処理のパフォーマンスを向上できることがわかっています (詳細は後述)。また、MSS_CS_CREATE レポートに対する機能追加の要望が寄せられたため、新たなバージョンのレポートプログラムが「SAP Note 2419662 – ERP テーブル用列ストア インデックスの改良」で公開されました。コードを更新するために、この SAP Note の修正指示を再適用する必要があります。

SAP CO-PA のパフォーマンス向上

あるお客様は、SQL Server の内部クエリの並列処理数を増やすだけで、飛躍的なパフォーマンスの向上に成功しました。SAPにおける並列処理についての詳細はこちらのブログ記事 (英語) を参照してください。SQL Server 構成オプションの並列処理の最大限度"max degree of parallelism"を大きく設定することもできますが、CO-PA 以外のすべての SAP クエリにも適用されてしまう点に注意が必要です。このお客様は、ABAP コードの SQL Server オプティマイザー ヒントを使用することにしました。ヒントの適用だけで、パフォーマンスは 10 倍に向上しました。さらに、特に大きな CE1、CE2、CE4 の各テーブルに NCCI を追加したことで、最終的に 77 倍の高速化 (771 秒から 10 秒に短縮) に成功しました。

ABAP オプティマイザー ヒントを使用してインデックスを強制適用

行ストアと列ストアインデックスを同一テーブルに対して有効かしている場合、SQL Server のクエリ オプティマイザーが適切な判断をすることが難しくなる場合があります。この場合、ABAP オプティマイザー ヒントを追加して対応することをお勧めします。たとえば、ERPTEST テーブルに対するクエリでABAP インデックス IN1 (SAP DDIC におけるインデックス名)の利用を強制したい場合、以下のヒントを追加します。
%_HINTS MSSQLNT 'TABLE ERPTEST abindex(IN1)'.

テーブル名とインデックス名は、大文字にする必要があります。SELECT 文で使用するテーブルが 1 つしかない (JOIN しない) 場合、テーブル名を明示的に指定する代わりに、&TABLE& を使用することができます。
%_HINTS MSSQLNT 'TABLE &TABLE& abindex(IN1)'.

以下のように、1 つの SELECT 文内でオプティマイザー ヒントを複数使用することもできます。
SELECT MAX( msgnr ) sprsl
FROM t100 INTO l_t_result
GROUP BY sprsl
%_HINTS MSSQLNT 'OPTION maxdop 8'
MSSQLNT 'OPTION hash group'.

1 行の中でオプティマイザー ヒントを組み合わせることもできます。
%_HINTS MSSQLNT 'OPTION maxdop 8 OPTION hash group'.

SQL Server のクエリ内並列処理でオプティマイザー ヒントを使用する場合、並列処理数を直接コーディングせず、変数を使用することをお勧めします (SAP BW の RSADMIN パラメーター MSS_MAXDOP_QUERY でも同様にされています)。ABAP コードは以下のようになります。

SAP CO-PA のオプティマイザー ヒント

このお客様は、CO-PA テンプレートの ABAP コードに複数の SQL Server オプティマイザー ヒントを追加しました。ヒントの追加には ABAP 変数を使用すると便利です。外部のフォーム ルーチン (GET_SQL_HINT など) で変数を設定することで、CO-PA コードの修正なしにヒントを変更することができます。

GET_SQL_HINT では、入力パラメーター (CO-PA のフォーム ルーチン名) に基づいて必要なオプティマイザー ヒントが計算され、ABAP 変数 SQL_HINT に代入されます。Z_COPA_SQL_HINTS レポート (GET_SQL_HINT を含む) が存在しない場合でも、エラーにはなりません。この場合、SQL_HINT 変数は空になり、オプティマイザー ヒントは追加されません。

  • 集約を使用する CE1、CE2、CE4 テーブルの SELECT 文には、MAXDOPHASH GROUP のヒントを追加しました。
    ここでは、RKEVRK2B_READ_COST を含むテンプレート内のフォーム ルーチンをいくつか変更し、GET_SQL_HINTのコールと %_HINTS、MSSQLNT、 SQL_HINT の各ヒントを追加しています。また、SQL_HINT 変数を
    'OPTION maxdop 16 OPTION hash group' に設定しました。以下は、RKEVRK2B_READ_COST を含むテンプレート内の OPEN_CURSOR_NO_HOLD_CE1 フォーム ルーチンの例です。
  • 集約を使用しない CE1、CE2、CE4 テーブルの SELECT 文には、異なるヒントを追加しました。
    集約を使用しない SELECT 文の中には、列ストア インデックスよりも従来からの行ストア インデックスを使用する方が効率的となるものがありました。ただし、他で選択されたパラメーターの SQL Server 実行プランを再利用すると、列ストア インデックスが使用されるため、結果的に CPU 負荷が高くなりパフォーマンスが十分に最適化されませんでした。前述のように、オプティマイザーのインデックス ヒントを使用することで、必要なインデックスを強制適用することができます。 このお客様の場合は、OPTIMIZE FOR UNKNOWN という別のオプティマイザー ヒントを使用して問題を解決しました。ここでは、RKEVRK2A_POST を含むテンプレート内の複数のフォーム ルーチンを変更し、GET_SQL_HINT のコールと %_HINTS、MSSQLNT、SQL_HINT の各ヒントを追加しています。SQL_HINT 変数は
    'OPTION optimize for unknown' に設定しました。以下は、RKEVRK2A_POST を含むテンプレート内の READ_ALL_PAOBJNRS_BY_CHARVALS フォーム ルーチンの例です。 テンプレートを変更しても、そのテンプレートを元に ABAP コードが再生成されるまでは、変更内容が適用されませんので注意してください。運用環境では SAP トランザクション KEA0 で再生成を行う必要があります。

SQL Server 2017 の機能強化

SQL Server 2017 では、NCCI のオンラインでの作成が可能です。SQL Server 2016 では、NCCI 作成はオフラインに限られていたため、インデックス作成の間は共有ロックがかかり、データの変更操作 (INSERT、UPDATE、DELETE) がすべてブロックされてしまっていました。SQL Server 2017 では、MSS_CS_CREATE レポートの実行において、オンライン実行とするかどうかを選択できるようになりました。オンラインでインデックスを作成する場合は処理時間が長くなり、tempdb 領域を大きく占有する点に注意が必要ですが、インデックス作成中に他の SAP ユーザーがブロックされることはありません。

MSS_CS_CREATE レポートの機能強化

SAP移送ランドスケープ経由で NCCI を移送することはできません。このため、開発、検証、運用の各システムで個別に NCCI を作成する必要があります。「変更不可」として構成される SAP の運用システムの場合でも、MSS_CS_CREATE レポートを実行することができます。ただし、変更不可の SAP システムでは、SAP トランザクション SE11 を使用して NCCI を削除することはできません。この問題を解決するために、MSS_CS_CREATE レポートに Delete Index ボタン(Del Indx)が追加されました。

MSS_CS_CREATE のもう 1 つの機能強化が、オンライン オプションです。上のスクリーンショットの SAP システムは SQL Server 2016 上にあるため、オプションはグレー アウトされています。

 

まとめ

NCCI を使用すると、SQL Server 2016 または 2017 で実行される SAP ERP システムのレポート処理を高速化することができます。しかし、(常にテーブルのデータが同時にいくつも変更されるような) 高いスループットのトランザクションがあるテーブルでは、あまり有効ではないと想定されます。お客様のシナリオに応じて、テーブルごとに NCCI を作成すべきかどうかを判断してください。