主キー制約を使用したクエリの最適化
プライマリ・キー制約は、テーブル内のフィールド間のリレーションシップをキャプチャするもので、ユーザーとツールがデータ内のリレーションシップを理解するのに役立ちます。 この記事には、 RELY
オプションと共に主キーを使用して、いくつかの一般的な種類のクエリを最適化する方法を示す例が含まれています。
主キー制約の追加
次の例のように、テーブル作成ステートメントにプライマリキー制約を追加することも、 ADD CONSTRAINT
句を使用してテーブルに制約を追加することもできます。
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
...
)
この例では、 c_customer_sk
は顧客 ID キーです。 プライマリ・キー制約は、各顧客 ID 値がテーブル内で一意であることを指定します。 Databricks では、キー制約は適用されません。 これらは、既存のデータパイプラインまたはETLを通じて検証できます。 ストリーミングテーブルと具体化されたビューでの作業期待の詳細については、「 パイプラインの期待値を使用してデータ品質を管理する 」を参照してください。 Delta テーブルでの制約の操作については 、「Databricks の制約 」を参照してください。
制約が満たされているかどうかを確認するのはユーザーの責任です。 満たされていない制約に依存すると、クエリ結果が正しくなくなる可能性があります。
RELY
を使用して最適化を有効にする
主キー制約が有効であることがわかっている場合は、RELY
オプションで指定することで、制約に基づく最適化を有効にできます。 完全な構文については、制約句の追加を参照してください。
RELY
オプションを使用すると、Databricks は制約を利用してクエリを書き換えることができます。次の最適化は、 RELY
オプションが ADD CONSTRAINT
句または ALTER TABLE
ステートメントで指定されている場合にのみ実行できます。
ALTER TABLE
を使用すると、次の例に示すように、テーブルのプライマリキーを変更して RELY
オプションを含めることができます。
ALTER TABLE
customer DROP PRIMARY KEY;
ALTER TABLE
customer
ADD
PRIMARY KEY (c_customer_sk) RELY;
最適化の例
次の例は、前の例を拡張して、c_customer_sk
が RELY
オプションが指定された PRIMARY KEY
として名前が付けられた検証済みの一意の識別子である customer
テーブルを作成します。
例 1: 不要な集計を削除する
次に、プライマリ・キーに DISTINCT
操作を適用するクエリを示します。
SELECT
DISTINCT c_customer_sk
FROM
customer;
c_customer_sk
列は検証済みの PRIMARY KEY
制約であるため、列内のすべての値は一意です。RELY
オプションを指定すると、Databricks はDISTINCT
操作を実行しないことでクエリを最適化できます。
例 2: 不要な結合を排除する
次の例は、Databricks が不要な結合を排除できるクエリを示しています。
このクエリは、ファクト テーブル ( store_sales
) をディメンション テーブル customer
に結合します。 左外部ジョインが実行されるため、クエリ結果には、 store_sales
テーブルのすべてのレコードと、 customer
テーブルの一致したレコードが含まれます。 customer
テーブルに一致するレコードがない場合、クエリ結果には c_customer_sk
列のNULL
値が表示されます。
SELECT
SUM(ss_quantity)
FROM
store_sales ss
LEFT JOIN customer c ON ss.customer_sk = c.c_customer_sk;
このジョインが不要な理由を理解するために、クエリ文について考えてみます。 store_sales
テーブルの ss_quantity
列だけが必要です。 customer
テーブルはプライマリ・キーで結合されるため、store_sales
の各ローは customer
の 1 行に一致します。操作は外部結合なので、store_sales
テーブルのすべてのレコードが保存されるため、結合によってそのテーブルのデータは変更されません。 SUM
集計は、これらのテーブルが結合されているかどうかに関係なく同じです。
プライマリ・キー制約を RELY
とともに使用すると、クエリ・オプティマイザはジョインをなくすために必要な情報を得ることができます。 最適化されたクエリは、次のようになります。
SELECT
SUM(ss_quantity)
FROM
store_sales ss
次のステップ
Catalog Explorer UIで主キーと外部キーの関係を探索する方法については、 エンティティ関係図の表示 を参照してください。