Code push downとは
ABAPにおけるCode push downとは、データを使って行う処理をできるだけデータベース側でさせるという考え方のことです。Code to data paradigmとも呼ばれます。
ABAP for HANA and “Code Push-Down”より
集計処理を書くときに、従来はDBからデータを取ってきて内部テーブルに格納し、それをループしながら計算を行う、といったことをしていました。なぜなら、複雑なSELECTをするとDBアクセスの負荷が大きくなり、パフォーマンスのボトルネックになってしまうからです。
しかし、HANA DBが登場したことによってDBアクセスはボトルネックではなくなり、むしろDB側でやったほうが速くできるようになりました。(インメモリー、カラムストア、データの圧縮、等々・・・)。
そこで、データ取得・編集にかかわる処理をDBレイヤでやってしまおうというCode push downが推奨されるようになりました。
Code push downを実現する方法
Code push downを実現する方法として、大きく2通りあります。以下では、これら2通りの方法について説明します。今回は概要編で、具体的な実装方法は別の回に書きたいと思います。
①Open SQLを使う
②DBレイヤにあるビューやプロシージャを使う(AMDP, CDS)
Open SQLを使う
Open SQLとは、ABAPで使えるSQLのことです。DBが直接理解できるNative SQLに対してOpen SQLと呼ばれます。
NetWeaver AS ABAP 7.4 SP5からOpen SQLに新しい機能が導入され、できることが増えました。(公式リファレンスはこちら)
新しいOpen SQLの機能を使うために、以下ののルールに従う必要があります。
- 複数の列を並べて書くときはカンマで区切る
- SQLの中で変数を使うときは先頭に@をつける
SELECT matnr, ersda, mtart
FROM mara
into table @data(itab_mara) up to 10 rows.
新しいOpen SQLでできること(一例)
- 計算式を使って計算した結果を受け取ることができる
- 文字列操作のファンクションを使うことができる
Open SQLを使ってCode push downを実現する5つの方法
以下のブログより翻訳、引用します。
Code Push Down for HANA Starts with ABAP Open SQL
- 新しいOpen SQLの構文を使う
- DBレイヤの集計機能が使えるときはそちらを使う(ABAPレイヤで集計しない)
- 計算式や文字列操作もDBレイヤで行う (ABAPレイヤでループして計算、操作しない)
- 計算をDBレイヤにpush downするために、計算結果を列で受け取るようにする(computed columnとして)
- CASEやIF..ELSEの条件分岐もOpen SQLの中で行うようにする
DBレイヤにあるビューやプロシージャを使う(AMDP, CDS)
もう一つは、DBレイヤに作られたビューやプロシージャをABAPレイヤから使用する方法です。同じ集計結果を何度も利用する場合はこちらのアプローチがよいと思われます。
SAP NetWeaver AS ABAP 7.4 SP5からTop-downと呼ばれる方法が導入され、ビューやプロシージャをABAPレイヤから作成することができるようになりました(実際のビュー等はDBレイヤに作られる)。これによって移送の問題(※)や、DB側とABAP側のオブジェクトの同期の問題が解決しました。
※以前のButtom-upと呼ばれる方法ではABAP側とDB側をそれぞれ移送する必要があった
ABAP for HANA and “Code Push-Down”から引用
Top-downアプローチの方法
AMDP, CDSという2つの方法があります。
AMDP(ABAP Managed Database Procedures)
AMDPはABAP側からSQLスクリプトを使ってプロシージャを作成する方法です。
プロシージャとは、DBにアクセスしてデータを取ってきたり、DBを更新したりする一連の手続きを記述したプログラムです。
AMDPはSQLスクリプトをラッピングするクラスで、初回実行時にDB側にプロシージャが作られます。AMDPクラスとして定義するには、if_amdp_marker_hdbというインターフェースを使用する必要があります。
CDS (Core Data Services)
CDSを使うと、ABAP側からDBレイヤにビューを作ることができます。ABAPプログラムからはCDSビューを通常のテーブルやビューのように取得することができます。
CDSの特徴として、Annotationによって機能をつけたり、FioriのUIを定義できるということがあります。これによって、ABAPプログラムからだけでなく様々な用途でCDSを使うことができます。
AMDP VS CDS
CDSのほうが様々な用途で使えるので、今後はCDSが主流になっていくのかなと思いましたが、以下のブログを読むとAMDPにしかできないこともあることがわかります(2019年5月時点の情報)。
AMDP | CDS | |
---|---|---|
複数の結果セットを返せるか | 〇 | × CDSは単一の結果のみ |
データの読み込み | 〇 | 〇 |
データの更新 | 〇 | × |
ストアドプロシージャを使えるか | 〇 | × |
Understanding evolution of CDS and AMDP in most simple wayをもとに作成 |
CDSは結合などで取ってこられる範囲のビューであり、更新や複雑なロジックが必要なときはAMDPを使う、という使い分けだと理解しました。
参考
ABAP for HANA and “Code Push-Down”
Code Push Down for HANA Starts with ABAP Open SQL
ABAP Managed Database Procedures – Introduction
ABAP Core Data Services – Introduction (ABAP CDS view)
Understanding evolution of CDS and AMDP in most simple way