コンテンツフレーム起動

データ転送数の最小化 文書を SAP ライブラリストラクチャに組み込む

オープン SQL 文では、アプリケーションサーバとデータベースシステム間でデータ転送が行われます。さらに各データベースアクセスに対して、データベースシステムによって管理データの構築または再開が行われる必要があります。したがって、データベースへのアクセス回数を最小にすることで、ネットワークおよびデータベースシステムにかかる負荷を最小化することができます。 

単一操作よりも複数操作

INSERTUPDATE および DELETE を使用してデータを変更する場合は、個別に入力するのではなく、内部テーブルを使います。SELECT を使ってデータを読み込む場合、データを複数回処理するのであれば複数操作をお奨めします。1 回だけの処理であれば、単純な選択ループが効率的です。 

反復アクセスの回避

原則としてプログラム内でのデータセットの読込は、単一アクセスを使い 1 回だけにしてください。同じデータに複数回アクセスすることは、避けてください (たとえば、UPDATE の前に SELECT)

ネストされた選択ループの回避

単純選択ループは単一データベースアクセスで、その結果は ABAP プログラムに行単位で渡されます。ネストされた選択ループでは、内部ループのアクセス数が外部ループのアクセス数だけ倍増することになります。したがってネストされた選択ループを使用するのは、外部ループの選択内に含まれる行数が非常に少ない場合のみにしてください。

ただしこれは例外であり、さまざまなデータベーステーブルからデータを組み合わせて使用することが、リレーショナルデータモデルでの原則です。以下の手法を使用して SELECT 命令がネストされるのを避けることができます。

ABAP ディクショナリビュー

データベーステーブル間の結合を、ABAP ディクショナリ内のビューとして静的に、かつシステム全体に定義することができます。ABAP ディクショナリビューはすべての ABAP プログラムで使用可能です。そのひとつの利点は、両方のテーブルに共通のフィールド (結合フィールド) が、データベースからアプリケーションサーバに 1 回だけ転送されることです。 

ABAP ディクショナリのビューは、内部結合として導入されます。外部テーブル内の行に対応する行が内部テーブルに含まれていないと、データは転送されません。これは必ずしも好ましい結果ではありません。たとえばテキストテーブルからデータを読み込む際に、対応するテキストが要求言語にない場合でも選択の中に行を含める必要があるかもしれません。外部テーブルからのデータをすべて含める場合は、ABAP の左側外部結合をプログラムすることができます。

ビュー領域内のテーブル間のリンクは、データベースシステムにより登録され最適化されます。データベーステーブルと同様に、ビューをアプリケーションサーバ上にバッファすることができます。テーブルと同じバッファリング規則がビューに適用されます。つまり、主にデータの読込に使用するビューには最適です。これによって、ネットワーク負荷およびデータベース内の物理的入出力量を削減できます。

FROM 句内の結合

FROM 句の内部結合または左外部結合を使用して、単一 SELECT 命令内の複数のデータベーステーブルデータを読み込むことができます。

結合を使用することのデメリットは、外部テーブルと内部テーブルの間に 1:N の関係がある場合、階層的に上位のテーブルからデータが読み込まれてしまうことです。それによってデータベースからアプリケーションに転送されるデータ量が、大幅に増加する場合があります。そのため結合をプログラムする場合は、SELECT 句に含まれる一覧が実際に必要とする列のみとなるようにしてください。さらに、結合はテーブルバッファをバイパスして、データベースから直接読み込みます。このため、データの読込だけが必要な場合は結合ではなく、ABAP ディクショナリビューを使用してください。

結合命令の実行時間はデータベースオプティマイザによって大きく左右されます。2 つ以上のデータベーステーブルが含まれている場合は特にそうです。しかし結合はほとんどの場合、ネストされた SELECT 命令を使用するより迅速です。

WHERE 句および HAVING 句のサブクエリ

WHERE 句またはHAVING 句のサブクエリを使用しても、同じオープン SQL 文内の複数のデータベーステーブルにアクセスすることができます。サブクエリによるデータは、アプリケーションサーバには転送されません。その代わり、データベースシステム内の条件を評価するために使用されます。これは複合データベース操作をプログラムするための、簡単で有効な方法です。

内部テーブルの使用

外部ループからの選択を内部テーブルに配置してから、FOR ALL ENTRIES 追加を使用して内部選択を 1 回だけ実行することで、選択ループがネストされないようにすることも可能です。この手法は、FROM 句内で結合が可能になる以前からありました。一方、データベースから冗長なデータが転送されることを防ぐことはできません。

カーソルを使用したデータの読込

もうひとつの方法は、OPEN CURSOR を使用してカーソルを開き、SELECT 命令から INTO 句を分離し、FETCH NEXT CURSOR を使用してデータを 1 行ずつ読み込むことです。ネストしたループのそれぞれに対して、新しくカーソルを開く必要があります。その場合は、データベーステーブルから正しい行が正しい順序で読み込まれるようにしてください。そのためには通常はデータベーステーブル間に外部キー関係があり、データベーステーブルが外部キーでソートされている必要があります。

 

 

 

 

 

コンテンツフレーム終了