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としてワンランク上のスキルとして見られるかもしれません。
というのも、これ「あんまり気にしない」からです。
ただ、もし知っていればパフォーマンスの悪化の原因を推測できたり、障害を解消したりする際のヒントになりえるかもしれません。