テーブル内のフィールド間のリレーションシップを捉える主キー制約は、ユーザーとツールがデータ内のリレーションシップを理解するのに役立ちます。 この記事には、主キーを RELY
オプションで使用して、一般的な種類のクエリを最適化する方法を示す例が含まれています。
手記
RELY
コマンドに関連付けられているクエリの最適化では、Photon 対応コンピューティングでクエリを実行する必要があります。 「Photon とは」を参照してください。 Photon は、SQL ウェアハウスと、ノートブックとワークフローのサーバーレス コンピューティングで既定で実行されます。 Photon の詳細については、「Photon とは」を参照してください。
:::
:::
主キー制約を追加する
テーブル作成ステートメントに主キー制約を追加する (次の例のように)、または、ADD CONSTRAINT
句を使用してテーブルに制約を追加することができます。
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
...
)
この例では、c_customer_sk
は顧客 ID キーです。 この主キー制約は、各顧客 ID 値がテーブル内で一意であることを指定しています。 Azure Databricks は、キー制約を適用しません。 これらは、既存のデータ パイプラインまたは ETL を使用して検証できます。 ストリーミング テーブルと具体化されたビューに対する作業の期待 については、「
手記
制約が満たされているかどうかを確認するのはユーザーの責任です。 満たされていない制約に依存すると、クエリ結果が正しくない可能性があります。
RELY
を使用して最適化を有効にする
主キー制約が有効であることがわかっている場合は、RELY
オプションで制約を指定することで、制約に基づく最適化を有効にすることができます。 完全な構文については、ADD CONSTRAINT 句の を参照してください。
この RELY
オプションを使用すると、Azure 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;
最適化の例
次の例では、customer
オプションが指定された c_customer_sk
として名前付けられた PRIMARY KEY
が検証済みの一意識別子である RELY
テーブルを作成した前の例を拡張します。
例 1: 不要な集計を排除する
主キーに DISTINCT
操作を適用するクエリを次に示します。
SELECT
DISTINCT c_customer_sk
FROM
customer;
c_customer_sk
列は検証済みの PRIMARY KEY
制約であるため、列内のすべての値は一意です。
RELY
オプションが指定されていると、Azure Databricks は DISTINCT
操作を実行しないことでクエリを最適化できます。
例 2: 不要な結合を排除する
次の例は、Azure Databricks が不要な結合を排除できるクエリを示しています。
このクエリでは、store_sales
ファクト テーブルと customer
ディメンション テーブルを結合します。 これは左外部結合を実行するため、クエリ結果には store_sales
テーブルのすべてのレコードと、customer
テーブルの一致するレコードが含まれます。
customer
テーブルに一致するレコードがない場合、クエリ結果には NULL
列には c_customer_sk
値が表示されます。
SELECT
SUM(ss_quantity)
FROM
store_sales ss
LEFT JOIN customer c ON ss.customer_sk = c.c_customer_sk;
この結合が不要な理由を理解するには、クエリ ステートメントを検討してください。 これには、ss_quantity
テーブルの store_sales
列のみが必要です。
customer
テーブルは主キーで結合されるため、store_sales
の各行は customer
のうち最大で 1 行に 一致します。 操作は外部結合であるため、store_sales
テーブルのすべてのレコードが保持されるため、結合によってそのテーブルのデータは変更されません。 これらのテーブルが結合されているかどうかに関係なく、SUM
集計は同じです。
主キー制約を RELY
で使用すると、結合を排除するために必要な情報がクエリ オプティマイザーに提供されます。 最適化されたクエリはむしろ次のようになります。
SELECT
SUM(ss_quantity)
FROM
store_sales ss
次のステップ
カタログ エクスプローラー UI で主キーと外部キーのリレーションシップを調べる方法については、「エンティティ リレーションシップ ダイアグラムの表示」を参照してください。