この章では、整合性制約について説明します。内容は次のとおりです。
整合性制約は、データが、データベース管理者によって指定されたガイドラインに従うことを保証するためのメカニズムです。最も一般的なタイプの制約は、次のとおりです。
一意
制約
特定の列が一意であることを保証します。
NOT
NULL
制約
NULL値が許されないことを保証します。
外部
キー
制約
2つのキーが主キーと外部キーの関係を共有することを保証します。
制約は、データ・ウェアハウスにおいて、次の目的に使用できます。
データの正当性
制約により、不適切なデータの挿入を防止するために、データ・ウェアハウスのデータがデータ整合性および正確さのガイドラインに従っているかどうかが検証されます。
問合せの最適化
Oracle Databaseでは、SQL問合せを最適化するときに、制約が使用されます。制約は、問合せの最適化に多くの点で効果的ですが、マテリアライズド・ビューのクエリー・リライトに特に重要です。
多くのリレーショナル・データベース環境とは異なり、データ・ウェアハウスのデータは通常、抽出、変換、ロード(ETL)プロセス中の、制御された状況下で追加または変更されます。通常、OLTPシステムとは異なり、複数のユーザーがデータ・ウェアハウスを直接更新することはありません。
データ・ウェアハウスにおいて最適な制約の使用方法を理解するには、まず、制約の基本的な目的を理解する必要があります。このような目的をいくつか次に示します。
施行
制約を施行するには、制約がENABLE
状態である必要があります。ENABLE状態の制約により、任意の1つ(または複数)の表におけるすべてのデータの変更が、制約の条件を満たすことが保証されます。データ変更操作によってデータが制約に違反する場合、その操作は制約違反エラーとなり正常に実行されません。
妥当性チェック
妥当性チェックを行うために制約を使用するには、制約がVALIDATE
状態である必要があります。制約がVALIDATED状態の場合、表に現在存在しているすべてのデータが制約を満たします。
妥当性チェックは、施行とは関係ありません。業務系システムでの一般的な制約はENABLEDおよびVALIDATED状態ですが、VALIDATED状態であってもENABLED状態でないか、またはその逆(ENABLED状態であってもVALIDATED状態でない)の場合もあります。後者の2つの状態は、データ・ウェアハウスで効果的です。
信頼
特定の制約の条件がTRUEであることがわかっているため、妥当性チェックや制約の施行を必要としない場合があります。しかしそのような場合でも、問合せの最適化やパフォーマンスの改善のために、制約を存在させることができます。この目的で使用する制約は、信頼またはRELY
制約と呼ばれ、RELY
状態である必要があります。RELY
状態は、指定された制約がTRUEであることを信頼してよいことをOracleに通知するメカニズムを提供します。
RELY
状態の影響を受けるのは、VALIDATED状態でない制約のみであることに注意してください。
この項では、読者が制約の一般的な使用方法を理解していることを前提としています。つまり、ENABLEかつVALIDATEDな状態の制約です。データ・ウェアハウスでは、このような制約の作成およびメンテナンスに非常にコストがかかるため、多くのユーザーにとって、このような制約が効率的でないことは明らかです。この項の内容は次のとおりです。
一意
制約は、通常、一意
索引を使用して規定されます。ただし、表が非常に大規模になる可能性があるデータ・ウェアハウスでは、一意索引を作成すると、処理時間およびディスク領域の点で非常にコストがかかる場合があります。
データ・ウェアハウスにsales
表があり、その表にsales_id
列が含まれているとします。sales_id
は、単一の売上トランザクションを一意に識別し、データ・ウェアハウス管理者は、この列がデータ・ウェアハウス内で一意であることを保証する必要があります。
制約を作成する方法の1つを、次に示します。
ALTER TABLE sales ADD CONSTRAINT sales_uk UNIQUE (prod_id, cust_id, promo_id, channel_id, time_id);
デフォルトでは、この制約はENABLEかつVALIDATEDな状態です。Oracleは、この制約をサポートするために、sales_id
に一意索引を暗黙的に作成します。ただし、次の3つの理由から、この索引がデータ・ウェアハウスでは不適切な場合があります。
sales
表には数百万または数十億もの行が含まれることが多いため、一意索引は非常に大きくなる可能性があります。
一意索引は、問合せの実行にはあまり使用されません。ほとんどのデータ・ウェアハウスの問合せは一意キーについての条件検索を行わないため、この索引を作成してもパフォーマンスが改善される可能性はあまりありません。
sales
がsales_id
以外の列でパーティション化されている場合は、一意索引はグローバル索引である必要があります。これによって、sales
表でのすべてのメンテナンス操作が悪影響を受ける場合があります。
一意索引は、sales
表で変更された個々の行が一意
制約を満たすことを保証するために必要です。
データ・ウェアハウス表の場合に使用できる、一意制約にかわる方法を次の文に示します。
ALTER TABLE sales ADD CONSTRAINT sales_uk UNIQUE (prod_id, cust_id, promo_id, channel_id, time_id) DISABLE VALIDATE;
この文によって一意キー制約が作成されますが、制約がDISABLED状態であるため、一意索引は必要ありません。この方法によって、制約が一意索引のデメリットの影響を受けずに一意性を保証できるため、多くのデータ・ウェアハウス環境でメリットがあります。
ただし、データ・ウェアハウス管理者が、DISABLE
VALIDATE
制約を考慮する場合にトレードオフがあります。この制約はDISABLED状態であるため、一意の列を変更するDML文はsales
表に対して実行できません。制約が存在する状態でこの表を変更するには、次の2つの方法があります。
DDLを使用して、この表にデータを追加します(パーティションの交換など)。第16章「データ・ウェアハウスのメンテナンス」の例を参照してください。
この表を変更する前に、制約を削除します。その後、すべての必要なデータ修正を行います。最後に、DISABLED状態の制約を再作成します。DISABLED状態の制約を再作成する方が、ENABLED状態の制約を再作成するより効率的です。ただし、この方法では、制約の削除中にsales
表に追加されたデータが一意であることは保証されません。
スター・スキーマ・データ・ウェアハウスでは、外部
キー
制約により、ファクト表とディメンション表のリレーションシップの妥当性がチェックされます。制約の例を次に示します。
ALTER TABLE sales ADD CONSTRAINT sales_time_fk FOREIGN KEY (time_id) REFERENCES times (time_id) ENABLE VALIDATE;
ただし、場合によっては、外部
キー
制約に異なる状態(特に、ENABLE NOVALIDATE
状態)を使用するように選択することがあります。データ・ウェアハウス管理者は、次のいずれかの場合に、ENABLE NOVALIDATE
制約を使用することがあります。
制約を満たさないデータが表にあるが、データ・ウェアハウス管理者が規定する制約を作成する場合
施行済の制約がすぐに必要な場合
データ・ウェアハウスで、新しいデータはファクト表に毎日ロードされ、ディメンション表は週末にのみリフレッシュされるとします。その週の間は、ディメンション表とファクト表が実際には外部
キー
制約を満たさない可能性があります。それでも、データ・ウェアハウス管理者は、ETLプロセス外で外部
キー
制約に影響する可能性がある変更が行われないようにするため、この制約を施行する場合があります。つまり、次のように、ETLプロセスの実行後に外部
キー
制約を毎晩作成できます。
ALTER TABLE sales ADD CONSTRAINT sales_time_fk FOREIGN KEY (time_id) REFERENCES times (time_id) ENABLE NOVALIDATE;
ENABLE
NOVALIDATE
を使用すると、制約がTRUEであると考えられる場合にも、施行される制約をすばやく作成できます。ETLプロセスによって、外部
キー
制約がTRUEであるかどうかが検証されるとします。データベースにこの外部
キー
制約を再検証させるには時間およびデータベース・リソースが必要となるため、かわりに、データ・ウェアハウス管理者は、ENABLE
NOVALIDATE
を使用して外部
キー
制約を作成できます。
ETLプロセスでは、通常、ある制約がTRUEかどうかが検証されます。たとえば、ETLプロセスはファクト表の受信データにあるすべての外部キーの妥当性チェックを実行します。これは、データ・ウェアハウスに制約を実装するかわりに、制約に従ったデータが提供されることが信頼できることを意味します。RELY
制約を次のように作成します。
ALTER TABLE sales ADD CONSTRAINT sales_time_fk FOREIGN KEY (time_id) REFERENCES times (time_id) RELY DISABLE NOVALIDATE;
この文は、主キーがRELY
状態であることを前提としています。RELY
制約は、データの妥当性チェックに使用されない場合にも、次のことができます。
マテリアライズド・ビューに対して、より高度なクエリー・リライトを使用可能にします。詳細は、第18章「基本的なクエリー・リライト」を参照してください。
その他のデータ・ウェアハウス・ツールによって、制約に関する情報をOracleデータ・ディクショナリから直接取り出すことができます。
RELY
制約の作成には、コストがほとんどかかりません。また、DML中やロード中にもオーバーヘッドは発生しません。制約がVALIDATED状態ではないため、その作成に必要なデータ処理はありません。
クエリー・リライトを使用する際は、NOT
NULL
制約が必要かどうかを考慮する必要があります。NOT NULL制約が必要となる典型例は、後戻り結合クエリー・リライトを使用する場合です。クエリー・リライト使用時のNOT
NULL
制約の詳細は、第19章「高度なクエリー・リライト」を参照してください。
すべての制約は、パラレルで妥当性チェックできます。非常に大規模な表で制約の妥当性チェックを行う場合、パフォーマンスの目標を達成するために、パラレル化が必要になります。ある任意の制約操作の並列度は、基礎となる表のデフォルトの並列度によって決定されます。
データをパーティション化する前に、制約を作成してメンテナンスできます。データ・ウェアハウスにおけるパーティション化の重要性については、以降の章を参照してください。パーティション化により、他の多くの操作の管理と同様に、制約管理も改善できます。たとえば、第16章「データ・ウェアハウスのメンテナンス」では、別々のステージング表に対して一意
制約および外部
キー
制約を作成する例を示しています。これらの制約は、EXCHANGE
PARTITION
文の実行中にメンテナンスされます。