次の方法で共有


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

テーブル内のフィールド間のリレーションシップを捉える主キー制約は、ユーザーとツールがデータ内のリレーションシップを理解するのに役立ちます。 この記事には、主キーを 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 を使用して検証できます。 ストリーミング テーブルと具体化されたビューに対する作業の期待 については、「パイプラインの期待値を使用してデータ品質を管理する」を参照してください。 Delta テーブルでの制約の操作については、詳しくは「Azure Databricks の制約」を参照 してください。

手記

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

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 で主キーと外部キーのリレーションシップを調べる方法については、「エンティティ リレーションシップ ダイアグラムの表示」を参照してください。