IBM i 7.3テンポラル表ってなんですか
Question
IBM i 7.3 テンポラル表という機能が追加されて便利と聞いたのですが、今いち、よくわかっていません。どういったもので、どんな風に使えるのでしょうか。IBM i 独特のものですか。
Answer
テンポラル表は、IBM DB2 10(IBM i では7.3)がSQL:2011という規格に準拠したことで生まれた新機能です。「テンポラリー表」と呼ばれる表とは異なります。DB2のテンポラル表とよく似た機能はSQL:2011に準拠した他DBでも発表されています。Oracleでは「フラッシュバッククエリ(FlashBack Query)」、MicrosoftではSQL Server2016の「テンポラル表」、PostgreSQLでは9.2からの「System temporal table」が同様の機能に該当します。IBMのDB2では該当のテーブルを「テンポラル表」、そしてそれを利用した過去データを照会する操作を「タイム・トラベル照会」と呼んでいます。
テンポラル表は(IBM以外の他DBでも同様ですが、)いつものテーブル(物理ファイル)に、3つのフィールドを追加したものです。その3つのフィールドは、レコードの追加や更新操作ごとに自動でタイムスタンプを記録するためのものです。テンポラル表の作り方は、CREATE TABLEを使ってこれら3つのフィールドをふくめたテーブルを新規作成、または既存ファイルにALTER TABLEを使って3つのフィールドを追加作成するという2つの方法があります。テンポラル表はSQLによるテーブルですので、IBMiのDDSコンパイルで作成することはできません。SQL文で、かつ、テンポラル表作成用のキーワードを用いて作成しなければなりません。
1つのテンポラル表は、必ず1つの履歴表(History table)とセットになっています。履歴表もSQL文で作成されるテーブル(物理ファイル)です。テンポラル表作成後に、SQL文で作成します。テンポラル表で1つレコードに変更があるたび、履歴表ではその変更前のレコードが時刻と共に保存されます。ジャーナルレシーバの物理ファイル版のようなイメージです(※ただしあくまで履歴の表ですので、管理方法はレシーバのそれとは異なります)。
例えば、仕入れ値や販売価格のデータベースを利用していて、「去年の同じ頃と値段と見比べたい」、「○月○日時点ではいくらだっただろう」と思った時、テンポラル表に対して専用のキーワードで日付を指定してSQL文を実行すれば、ひもづいている履歴表のタイムスタンプから、対象のレコードを探し出し、即そのデータを確認することができます。あたかも、該当の日付のデータをどこかに保存してあったかのように、当時の表の様子をそのまま再現できるのです。これが「タイム・トラベル照会」です。
お客様の中には、同様のことを行うために、4月分のファイル、5月分のファイル...と定期的に分けてマシン上に別途コピーされている方もいますが、そういった手間がなくなるというわけです。
IBMは、このテンポラル表の機能とOLAP機能をあわせて、IBM DB2を統計分析のより行いやすいDBとしてアピールしていますが、すでに運用中のIBMi(AS400)にテンポラル表機能を取り入れるには、多くの壁があるように思います。
1点目として、テンポラル表は便利な機能ですが、IBMiの性質上、現存の物理ファイルに項目を追加しテンポラル表化した場合、それを参照する一連のRPGなどのPGMも再コンパイルが必要となります。
2点目として、履歴表はジャーナルレシーバのように設定値による自動の切替や破棄ができません。データ更新の頻度が非常に多い物理ファイルに利用すると、履歴表のデータ容量管理の仕組みも考えなければなりません。データを純粋に削除するのか、区分を分けて保管をして削除するのか、それらをPGMを組んで対応するのか、手動で行うのか...様々な内容を検討する必要があります。
3点目として、一度テンポラル表化した後は、基本的にテーブルの仕様変更はDDSではなくSQLのALTER TABLEコマンドを利用することになります。DDSではテンポラル表を作成できないためです。IBMiをお使いのお客様の中では、普段DDSやRPGで管理しているためSQLに不慣れな方が多く、また、SQLの得意な方がいた場合は、逆にIBMiのことがわからないというケースが多いように思います。フィールドの定義ひとつとっても、SQLとIBMi DB2では違いがあります。両方の仕組みをある程度わかった上でないと、長期的な目線でみた時、運用管理に不安が残るのではないでしょうか。これはテンポラル表導入に限らず、SQL機能を(パッケージソフト購入でなくユーザーによる作成で)IBMiに取り入れていく上で、長い間、一つの大きな壁となっている問題です。
補足となりますが、IBMiのDB2で利用できるのは、テンポラル表の中でも「システム期間テンポラル表」のみとなります。DB2にはその他「アプリケーション期間テンポラル表」、「バイテンポラル表」がありますが、現在それらを利用できるのはUNIXやWindows上のIBM DB2で、IBMi上のDB2では利用できません。