LoginSignup
10
10

More than 3 years have passed since last update.

【ABAP】Code push downを実現する方法

Posted at

Code push downとは

ABAPにおけるCode push downとは、データを使って行う処理をできるだけデータベース側でさせるという考え方のことです。Code to data paradigmとも呼ばれます。
image.png
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)
image.png

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

  1. 新しいOpen SQLの構文を使う
  2. DBレイヤの集計機能が使えるときはそちらを使う(ABAPレイヤで集計しない)
  3. 計算式や文字列操作もDBレイヤで行う (ABAPレイヤでループして計算、操作しない)
  4. 計算をDBレイヤにpush downするために、計算結果を列で受け取るようにする(computed columnとして)
  5. 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側をそれぞれ移送する必要があった

image.png
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というインターフェースを使用する必要があります。

image.png

CDS(Core Data Services)

CDSを使うと、ABAP側からDBレイヤにビューを作ることができます。ABAPプログラムからはCDSビューを通常のテーブルやビューのように取得することができます。
CDSの特徴として、Annotationによって機能をつけたり、FioriのUIを定義できるということがあります。これによって、ABAPプログラムからだけでなく様々な用途でCDSを使うことができます。

image.png

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

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10