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;
Copy

ステートメントが右側の 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;
Copy

このステートメントは、不必要に 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;
Copy

このステートメントは、結合の主キー列を除いて、右側の dim_products テーブルの列を参照していません。

dim_products.product_id 列に PRIMARY KEY 制約があり、 fact_sales.product_id 列に FOREIGN KEY 制約がある場合、Snowflakeはこの結合を不要なものとして識別し、右側の dim_products テーブルへの参照を削除します。