Snowflakeが冗長な結合を削除する方法を理解する¶
場合によっては、キー列での結合が、結合に不要なテーブルを参照することがあります。テーブルにキー列があり、 UNIQUE、 PRIMARY KEY、および FOREIGN KEY 制約を使用および適用している場合、Snowflakeはキー列の不要な結合を削除して、クエリのパフォーマンスを向上させることができます。
これらの最適化は、 RELY 制約プロパティを使用して、テーブル内のデータが主キーと外部キーに関する制約に準拠していることを示す場合にのみ実行されます。
このトピックの内容:
不要な結合を削除するための RELY 制約プロパティの設定¶
Snowflakeは、テーブル内のデータが UNIQUE、 PRIMARY KEY、および FOREIGN KEY 制約に準拠していることを示す場合にのみ、結合に対してこの最適化を実行します。
サポートされている制約のタイプ で述べたように、Snowflakeは UNIQUE、 PRIMARY KEY、および FOREIGN KEY の制約を適用しません。テーブル内のデータにこれらの制約を適用する責任はご自身にあります。
データがこれらの制約に準拠していることを確認し、Snowflakeで不要な結合を削除する場合は、UNIQUE、 PRIMARY KEY、 FOREIGN KEY 制約に RELY 制約プロパティを設定します。
注釈
制約(UNIQUE、 PRIMARY KEY、および FOREIGN KEY)の整合性を維持する責任はご自身にあります。制約の整合性が維持されていない場合、 RELY 制約プロパティが設定されていると、クエリの結果が異なる場合があります(NORELY を使用した結果と比較して)。
不要な結合を削除する例¶
次の例は、Snowflakeが不要なテーブルへの結合と参照を削除するケースを示しています。
この例では、
dim_products
は購入可能な各製品の行を含むテーブルです。このテーブルでは、
product_id
は製品を一意に識別する列です。fact_sales
は製品の各販売に対する行を含むテーブルです。このテーブルでは、
product_id
は販売された製品を識別する列です。この列の IDs は、dim_products
テーブルのproduct_id
列の IDs に対応します。
例1: 不要な左外部結合の削除¶
以下は、Snowflakeが最適化できる不要な左外部結合の例です。
SELECT f.*
FROM fact_sales f
LEFT OUTER JOIN dim_products p
ON f.product_id = p.product_id;
ステートメントが右側の dim_products
テーブルの列を参照していないため(結合の主キー列を除く)、結合は不要です。
dim_products.product_id
列に RELY プロパティを持つ UNIQUE または PRIMARY KEY 制約がある場合、Snowflakeはこの結合を不要なものとして識別し、右側の dim_products
テーブルへの参照を削除します。
例2: 不要な自己結合の削除¶
以下は、Snowflakeが最適化できる不要な自己結合の例です。
SELECT p1.product_id, p2.product_name
FROM dim_products p1, dim_products p2
WHERE p1.product_id = p2.product_id;
このステートメントは、不必要に dim_products
テーブルをそれ自体と結合し、そのテーブルから列を選択します。
dim_products.product_id
列に RELY プロパティを持つ UNIQUE または PRIMARY KEY 制約がある場合、Snowflakeはこの結合を不要なものとして識別し、右側の dim_products
テーブルへの参照を削除します。
例3: 主キーと外部キーの不要な結合の削除¶
以下は、Snowflakeが最適化できる不要な内部結合の例です。
SELECT p.product_id, f.units_sold
FROM fact_sales f, dim_products p
WHERE f.product_id = p.product_id;
このステートメントは、結合の主キー列を除いて、右側の dim_products
テーブルの列を参照していません。
dim_products.product_id
列に PRIMARY KEY 制約があり、 fact_sales.product_id
列に FOREIGN KEY 制約がある場合、Snowflakeはこの結合を不要なものとして識別し、右側の dim_products
テーブルへの参照を削除します。