各システム期間テンポラル表は、履歴表を必要とします。
システム期間テンポラル表の行が更新または削除されると、データベース・マネージャーは古い行のコピーをそれに関連した履歴表に挿入します。
この古いシステム期間テンポラル表データの保管により、過去の時点のデータを取り出すことができます。
行データを保管するには、履歴表の列とシステム期間テンポラル表の列の名前、順序、およびデータ・タイプが同じでなければなりません。
CREATE TABLE ステートメントの LIKE 節を使用することにより、システム期間テンポラル表の列と同じ名前と説明を持つ履歴表を作成することができます。以下はその例です。
CREATE TABLE employees_history LIKE employees IN hist_space;
ALTER TABLE ステートメント USE HISTORY 節の説明にリストされている制限に既存の表が抵触しない場合、その既存の表を履歴表として使用することができます。
履歴表を作成した後、バージョン管理を追加して、システム期間テンポラル表と履歴表の間のリンクを確立します。
ALTER TABLE employees ADD VERSIONING USE HISTORY TABLE employees_history;
バージョン管理を使用可能にすると、履歴表は以下の規則と制限に従います。
- 履歴表を明示的にドロップすることはできません。
関連したシステム期間テンポラル表がドロップされるときに暗黙的にドロップすることしかできません。
- 履歴表の列を明示的に追加、ドロップ、または変更することはできません。
- 参照制約において履歴表を親、子、または自己参照として定義してはなりません。
履歴表に対するカスケード・アクションを防止するために、履歴表へのアクセスは制限されています。
- 履歴表は含まれているが、それに関連したシステム期間テンポラル表が含まれていない表スペースをドロップすることはできません。
履歴表の明示的変更が必要になるような状況はほとんどありません。
これを行うと、システム期間テンポラル表のデータ履歴を監査できなくなる可能性があります。
履歴表へのアクセスを制限してそのデータを保護する必要があります。
通常の操作では、履歴表に対するアクティビティーのほとんどは挿入と読み取りです。
更新や削除はめったにありません。
更新や削除がないということは、通常は新しい行の挿入に再使用できるフリー・スペースが履歴表にないことを意味します。
履歴表への行の挿入によってワークロード・パフォーマンスに悪影響が出ている場合は、
APPEND ON オプションを使用して履歴表の定義を変更することにより、フリー・
スペースの検索をしないようにすることができます。
このオプションを使用すると、フリー・スペースの検索に関連した処理が行われず、新しい行は表の末尾に直接付加されます。
ALTER TABLE employees_history APPEND ON;
システム期間テンポラル表をドロップすると、それに関連した履歴表およびその履歴表で定義されている索引は暗黙的にドロップされます。
システム期間テンポラル表をドロップするときに履歴データが失われないようにするために、RESTRICT ON DROP 属性を使って履歴表を作成するか、RESTRICT ON DROP 属性を追加することによって履歴表を変更することができます。
CREATE TABLE employees_history LIKE employees WITH RESTRICT ON DROP;
履歴表では削除より挿入の方が多く行われるため、履歴表は常に大きくなり続け、消費されるストレージの量は増え続けます。
履歴表を整理して不要になった行を除去する方法を決めるのは、複雑な作業になることがあります。
それを行うときには、個々のレコードの価値を知っている必要があります。
顧客契約など手を付けてはならない内容もあり、それらは決して削除できません。
一方、Web サイト訪問者の情報など、心配せずに整理できるレコードもあります。
通常、行の整理とアーカイブをいつ行えるかを判定するときには、行の経過時間ではなく、何らかのビジネス・ロジックが決定要因となります。
整理に関する規則として考えられるものを以下にリストします。
- ビジネス・ルールを反映したユーザー提供の照会によって選択された行を整理する。
- 特定の経過時間より古い行を整理する。
- レコードのバージョンが N 個を超えたらその履歴行を整理する (最新の N 個のバージョンのみ保持する)。
- 関連付けられているシステム期間テンポラル表からレコードが削除された時点で履歴行を整理する (現行バージョンがない場合)。
履歴表から古いデータを定期的に整理する方法として、以下の例があります。
- 範囲パーティションを使用して古いパーティションを履歴表からデタッチする。
- DELETE ステートメントを使用して表から行を削除する。
DELETE ステートメントを使用する場合には、以下の指針に従うこともできます。
- 履歴表を定期的に再編成して、削除操作後に残ったフリー・スペースを解放する。
- 履歴表が APPEND ON オプションを使用するようには変更されなかった (つまり、挿入時に行うフリー・スペースの検索が可能になっている) ことを確認する。