メインコンテンツまでスキップ

主キー制約を使用したクエリの最適化

プライマリ・キー制約は、テーブル内のフィールド間のリレーションシップをキャプチャするもので、ユーザーとツールがデータ内のリレーションシップを理解するのに役立ちます。 この記事には、 RELY オプションと共に主キーを使用して、いくつかの一般的な種類のクエリを最適化する方法を示す例が含まれています。

主キー制約の追加

次の例のように、テーブル作成ステートメントにプライマリキー制約を追加することも、 ADD CONSTRAINT 句を使用してテーブルに制約を追加することもできます。

SQL
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 オプションを含めることができます。

SQL

ALTER TABLE
customer DROP PRIMARY KEY;
ALTER TABLE
customer
ADD
PRIMARY KEY (c_customer_sk) RELY;

最適化の例

次の例は、前の例を拡張して、c_customer_skRELY オプションが指定された PRIMARY KEY として名前が付けられた検証済みの一意の識別子である customer テーブルを作成します。

例 1: 不要な集計を削除する

次に、プライマリ・キーに DISTINCT 操作を適用するクエリを示します。

SQL
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値が表示されます。

SQL
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 とともに使用すると、クエリ・オプティマイザはジョインをなくすために必要な情報を得ることができます。 最適化されたクエリは、次のようになります。

SQL
SELECT
SUM(ss_quantity)
FROM
store_sales ss

次のステップ

Catalog Explorer UIで主キーと外部キーの関係を探索する方法については、 エンティティ関係図の表示 を参照してください。