【ABAP】クラスタテーブルとプールテーブルの全貌を明かす

ABAP

SAPのテーブルは、大きく分けて3種類に分類することができます。

その3種類、全て理解していますか?

と言いつつ、3種類あるんだーと言われても分からない人が多いのが実情かと思います。

このページの内容を理解して「一段上のスキルを持っているなあ」と感心されるABAPerを目指しましょう。

スポンサーリンク
スポンサーリンク

テーブルには3種類ある

SAPのテーブルを大きく分類すると

① 透過テーブル

② プールテーブル

③ クラスタテーブル

の3つに分けることができます。

この3つは何が違うのかというと「データベースへの保存方法」です。

トランザクションコード:SE11からABAPディクショナリでテーブルを登録する手順を下記ページで解説しました。

ここで登録したテーブルは、SAPのアプリケーションサーバ上で保存された後、有効化したタイミングでSAPのデータベースサーバに保存されます。

透過テーブルの場合、ABAPディクショナリ上で登録した構造と同じ構造でデータベース上に保存されます。

つまり、SE11から見た画面通りにデータベース上に保存されている、ということです。

一方でプールテーブルとクラスタテーブルはデータベース上での保存のされ方が、SE11で見た時と微妙に異なって保存されます。

ここからは本題「プールテーブルとクラスタテーブルとは何か」から解説していきます。

プールテーブルとは

透過テーブルはテーブル1つ1つがそのままデータベース上で登録されています。

それに対して、プールテーブルは「いろんなテーブルが1つのテーブルに登録」されています。

どういうこと?となるかもしれません。順を追って説明していきます。

プールテーブルの保存方式

まずは以下の図:二つのプールテーブルをSE11(ABAPディクショナリ)から見た時のイメージをご覧ください。

もう一度説明をしますが、もしこれが透過テーブルの場合であればこの形のままデータベース上に保存されます。

が、プールテーブルは先ほど説明したように「1つのテーブル上に保存される」のでした。

ややこしいのですが、この「1つのテーブル」の名称は「テーブルプール」と言います。

「③ プールテーブル」が格納されるテーブルが「テーブルプール」です。

テーブルプールの構造は以下のように決まっています。

テーブルプールへの格納イメージ

テーブルプールは、ご覧のように一番左の項目に「テーブル名」を持っています。

つまり、保存のされ方を図示すると以下のようになります。

これでなんとなく「1つのテーブルに保存」の意味が分かるかと思います。

プールテーブルは、テーブルプールにまとめて格納されるのです。

テーブルプールの構造

テーブルプールは4つの項目を持ちます。

詳細まで把握している必要はありませんが、参考として覚えておくとちょっとだけハナタカです。

先ほどのテーブルプールの画像と合わせて学んでみてください。

項目データ型説明
Tabname CHAR(10)テーブルの名称が入ります
Varkey CHAR (1~110)プールテーブルの全てのキー項目が文字列として入ります
Dataln INT2(5)↓のデータの長さ
Vardata RAW (n)プールテーブルのキー項目以外の全てのデータが入ります

クラスタテーブル

実はプールテーブルの概念を理解してしまえば、クラスタテーブルの理解は早いです。クラスタテーブルも「1つのテーブル」に格納されているという意味で全く同じです。

この1つのテーブルの名称を「テーブルクラスタ」と言います。

ややこしさは同じですね。。。

プールテーブルとクラスタテーブルの違い

では、プールテーブルとクラスタテーブルは何が違うのでしょうか?答えは「クラスタテーブルは主要キーで内部結合されている」ということです。

プールテーブルでは、データがそのまま格納されているのに対して、クラスタテーブルは「主要キーで内部結合された状態」で保存されているということです。先ほどのテーブルをクラスタテーブルバージョンで表すと以下のようになります。

※「主要キーで内部結合された状態」というのがイメージしづらい形はこちらのページをご覧ください。

テーブルクラスタの構造

項目データ型説明
CLKEYn* n 番目のキー項目を表す
例)CLKEY1、CLKEY2・・
Pageno INT2(5) 継続レコードの番号
Timestamp CHAR(14) タイムスタンプ
Pagelg INT2(5) ↓のデータの長さ
Vardata RAW (n) プールテーブルのキー項目以外の全てのデータが入ります

テーブルプールと違い、項目数は固定ではなくなります。これは、キー項目を何個にするかの指定によって異なるためです。

継続レコードとは?

上記表中青線ハイライト部分の「継続レコード」について解説します。

継続レコードとは「何番目のレコードか?」という情報を持つ項目になります。

キー項目以外の項目、すなわち「Verdata」の最大長は有限です。※最大長は、データベースシステムによって異なります。

テーブルプールでは、内部結合を行わないそのままのデータであるため、最大長を越えるデータが生まれることはありませんが、テーブルクラスタでは内部結合の結果次第で項目数が増加するため、最大長を越える場合があります。

その際、継続レコード項目で1,2,3と項番を振ることによって最大長越えのキー項目に対応をしています。

項番は0から始まる昇順で採番されます。

プールテーブルとクラスタテーブルの注意点

NativeSQLが利用できない

NativeSQLとは、データベースを直接読みに行くSQLのことを指します。

データベース上では、上記で解説してきたようにキー項目以外は全て文字列で結合されている状態ので、データベース上を直接読むNativeSQLは利用できません。OpenSQLは利用可能です。

※OpenSQLとNativeSQLの違いはこちらで詳しく解説しております。

キー項目以外を抽出条件に入れない

SQL文のWHERE句でキー項目以外の項目を抽出条件に入れると著しくパフォーマンスが悪化します。

上記で述べた通り、キー項目以外の項目は文字列で結合されている状態です。

したがって、それらを抽出条件に入れてしまうと、結合を分解し処理することになるので、その分パフォーマンスが悪化します。

SELECT文で内部結合・外部結合ができない

内部結合・外部結合はできません。

最後に

プールテーブルとクラスタテーブルを知っているとABAPerとしてワンランク上のスキルとして見られるかもしれません。

というのも、これ「あんまり気にしない」からです。

ただ、もし知っていればパフォーマンスの悪化の原因を推測できたり、障害を解消したりする際のヒントになりえるかもしれません。

タイトルとURLをコピーしました