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 を使用した結果と比較して)。

不要な結合を削除する例

The following examples demonstrate cases in which Snowflake eliminates joins and references to tables that are not necessary:

この例では、

  • 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 テーブルへの参照を削除します。