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

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

テーブル内のフィールド間の一意性の関係を表す主キーとユニーク制約は、ユーザーとツールがデータ内の関係を理解するのに役立ちます。本記事では、「RELY」オプションと主キーまたは一意性制約を使用して、一般的な種類のクエリを最適化する方法の例を説明しています。

注記

RELYコマンドに関連付けられたクエリの最適化では、Photon対応コンピュートでクエリを実行する必要があります。Photonとはを参照してください。SQLウェアハウスとノートブックやワークフローにおけるサーバレスコンピュートでは、Photonはデフォルトで実行されます。Photonの詳細については、Photonとはを参照してください。

主キーまたは一意制約を追加する

次の例に示すように、テーブル作成ステートメントで主キーまたは一意制約を追加したり、ADD CONSTRAINT句を使用してテーブルに追加できます。

SQL
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
)

この例では、c_customer_sk は顧客 ID キーです。プライマリ・キー制約は、各顧客 ID 値がテーブル内で一意であることを指定します。一意制約は、PRIMARY KEYではなくUNIQUEを使用して、同じパターンに従います。

Databricks では、キー制約は適用されません。 これらは、既存のデータパイプラインまたはETLを通じて検証できます。 ストリーミングテーブルと具体化されたビューでの作業期待の詳細については、「 パイプラインのエクスペクテーションを使用してデータ品質を管理する 」を参照してください。 Delta テーブルでの制約の操作については、「 Databricks の制約 」を参照してください。

注記

制約が満たされているかどうかを確認するのは、ユーザーの責任です。満たされていない制約に依存すると、クエリ結果が正しくなくなる可能性があります。

RELYを使用して最適化を有効にする

主キーまたは一意制約が有効であることを認識している場合、RELY オプションで指定することにより、その制約に基づいた最適化を有効にできます。完全な構文については、ADD CONSTRAINT句を参照してください。

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テーブルを作成する前の例を拡張したものです。同じ最適化は、UNIQUE制約にRELYオプションを付けて適用できます。

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

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

SQL
SELECT
DISTINCT c_customer_sk
FROM
customer;

c_customer_sk 列は検証済みの PRIMARY KEY 制約であるため、列内のすべての値は一意です。RELY オプションを指定すると、Databricks はDISTINCT操作を実行しないことでクエリを最適化できます。

オプティマイザーは、選択された列が有効なUNIQUE制約によってRELYで指定されている場合、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とともにプライマリ・キーまたはUNIQUE制約を使用すると、クエリ最適化機能が結合を排除するために必要な情報が提供されます。最適化されたクエリは次のようになります。

SQL
SELECT
SUM(ss_quantity)
FROM
store_sales ss

次のステップ

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