主キーおよび一意制約に対して
プライマリキーとユニーク制約は、テーブル内の各行を一意に識別する列を指定します。 外部キーとともに、ユーザーやツールがデータ内の関係性を理解するのに役立ちます。 これらの制約を RELY オプションで指定すると、クエリオプティマイザはクエリを書き換えることができます。例えば、キーカラムの DISTINCT 操作を削除したり、結果を変えない結合を除外したりします。
手記
RELY クエリ最適化にはプロまたはサーバーレスのSQLウェアハウス、またはサーバーレスのコンピュートが必要であり、従来のSQLウェアハウスではサポートされていません。
主キー制約または一意制約を追加する
次の例のように、テーブル作成ステートメントに主キー制約または一意制約を追加するか、 ADD CONSTRAINT 句を使用してテーブルに追加できます。
CREATE TABLE customer (
c_customer_sk int,
PRIMARY KEY (c_customer_sk)
)
この例では、c_customer_sk は顧客 ID キーです。 この主キー制約は、各顧客 ID 値がテーブル内で一意であることを指定しています。 一意の制約は、UNIQUEではなくPRIMARY KEYを使用して同じパターンに従います。
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 テーブルを作成した前の例を拡張します。
UNIQUE オプションを使用して、同じ最適化をRELY制約に適用できます。
例 1: 不要な集計を排除する
主キーに DISTINCT 操作を適用するクエリを次に示します。
SELECT
DISTINCT c_customer_sk
FROM
customer;
c_customer_sk 列は検証済みの PRIMARY KEY 制約であるため、列内のすべての値は一意です。
RELY オプションが指定されていると、Azure Databricks は DISTINCT 操作を実行しないことでクエリを最適化できます。
選択した列が、DISTINCTで指定された有効なUNIQUE制約でカバーされている場合、オプティマイザーはRELYを削除することもできます。
例 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 で主キーと外部キーのリレーションシップを調べる方法については、「エンティティ リレーションシップ ダイアグラムの表示」を参照してください。