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

主キー制約は、テーブル内のフィールド間のリレーションシップをキャプチャし、ユーザーやツールがデータ内のリレーションシップを理解するのに役立ちます。 この記事では、主キーと 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_skRELY オプションが指定された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 で主キーと外部キーの関係を調べる方法については、 エンティティ関係図の表示 を参照してください。