主キー制約を使用したクエリの最適化
主キー制約は、テーブル内のフィールド間のリレーションシップをキャプチャし、ユーザーやツールがデータ内のリレーションシップを理解するのに役立ちます。 この記事では、主キーと RELY
オプションを使用して、いくつかの一般的な種類のクエリを最適化する方法を示す例を紹介します。
主キー制約を追加する
次の例のように、テーブル作成ステートメントで主キー制約を追加するか、 ADD CONSTRAINT
句を使用してテーブルに制約を追加できます。
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
...
)
この例では、 c_customer_sk
顧客 ID キーです。 主キー制約は、各顧客 ID 値がテーブル内で一意であることを指定します。 Databricks はキー制約を強制しません。 既存のデータパイプラインまたはETLを通じて検証できます。 ストリーミング テーブルとマテリアライズド ビューでの動作の期待値については、「Delta Live Tables を使用したデータ品質の管理」を参照してください。 Delta テーブルでの制約の操作方法については、 「Databricks での制約」を参照してください。
注:
制約が満たされているかどうかを確認するのは、ユーザーの責任です。 満たされていない制約に依存すると、クエリ結果が正しくなくなる可能性があります。
RELY
を使用して最適化を有効にする
主キー制約が有効であることがわかっている場合は、 RELY
オプションで制約を指定することで、制約に基づく最適化を有効にすることができます。 完全な構文については、 ADD CONSTRAINT 句 を参照してください。
RELY
オプションを使用すると、Databricks は制約を利用してクエリを書き換えることができます。 以下の最適化は、ADD CONSTRAINT
句または ALTER TABLE
ステートメントで RELY
オプションが指定されている場合にのみ実行できます。
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
次のステップ
カタログエクスプローラ UI で主キーと外部キーの関係を調べる方法については、 エンティティ関係図の表示 を参照してください。