検索最適化による結合クエリの高速化

検索最適化サービスは、結合のビルド側で個別の値の数が少ない結合クエリのパフォーマンスを向上させることができます。

例えば、検索最適化サービスは次のようなタイプの結合のパフォーマンスを向上させることができます:

  • products は各製品の行が含まれるテーブルであり、 sales は製品の各販売の行を含むテーブルであるとします。 products の行数は少なく、 sales よりも小さくなります。特定の製品の売上すべてを確認するには、 sales テーブル(大きい方のテーブル)を products テーブル(小さい方のテーブル)と結合します。 products テーブルは小容量であるため、結合のビルド側に個別の値はほとんどありません。

    注釈

    データウェアハウジングでは、大きなテーブルは ファクトテーブル と呼ばれることがよくあります。小さなテーブルは ディメンションテーブル と呼ばれます。このトピックの残りの部分では、結合内の大きなテーブルと小さなテーブルを参照するときにこれらの用語を使用します。

  • customers は各顧客の行が含まれるテーブルであり、 sales は各販売の行を含むテーブルであるとします。どちらのテーブルも大容量です。特定の顧客の全売上高を検索するには、 sales テーブル(プローブ側)と customers テーブル(ビルド側)を結合し、フィルターを使用して、結合のビルド側に個別の値が少数だけ存在するようにします。

このトピックの内容:

結合のパフォーマンスを改善する検索最適化サービスの有効化

検索最適化サービスを有効にして結合のパフォーマンスを改善するには、テーブルで結合のプローブ側に 検索最適化を追加 します。このテーブルは通常、結合クエリでフィルターされない大容量テーブル(ファクトテーブルなど)です。

検索最適化を活用するには、ディメンジョンテーブルを小さくするか、選択フィルターを適用して、結合のビルド側に個別の値が少数だけ存在するようにします。クエリの検索最適化にかかるコストは、結合のビルド側で検索しなければならない個別の値の数に比例します。この数が多すぎる場合、Snowflakeは検索アクセスパスを使用しないことを決定し、代わりに通常のテーブルアクセスパスを使用する可能性があります。

サポートされている結合述語

検索最適化サービスにより、次の型の結合述語を使用してクエリのパフォーマンスを改善できます。

  • probe_side_table.column = build_side_table.column 形式の等値述語。

  • 述語のビルド側オペランドに対する変換(例えば、文字列連結、加算など)。

  • 複数の等価述語の結合(AND)。

サポートされるクエリの例

このセクションでは、検索最適化のメリットがある結合クエリの例を示します。

例: 単純な等価述語

以下は、単純な等価述語を結合述語として使用する、サポートされているクエリの例です。このクエリは、 sales という名前のテーブルを customers というテーブルと結合します。プローブ側のテーブル sales は大容量で、検索最適化が有効になっています。ビルド側テーブル customers も大容量ですが、 customer_id 列の選択フィルターにより、このテーブルからの入力は小さくなります。

SELECT sales.date, customer.name
  FROM sales JOIN customers ON (sales.customer_id = customers.customer_id)
  WHERE customers.customer_id = 2094;
Copy

例: ディメンジョン側オペランドで変換された述語

以下のクエリは、 sales という名前のファクトテーブルと、 products という名前のディメンジョンテーブルを結合します。ファクトテーブルが大きく、検索最適化が有効になっています。ディメンジョンテーブルは小容量です。

このクエリは、述語のディメンジョン側オペランドを(例えば、結合条件の値を乗算することによって)変換し、検索最適化のメリット得ることができます:

SELECT sales.date, product.name
  FROM sales JOIN products ON (sales.product_id = product.old_id * 100)
  WHERE product.category = 'Cutlery';
Copy

例: 複数の列にまたがる述語

結合述語が複数の列にまたがるクエリは、検索最適化のメリットを得ることができます。

SELECT sales.date, product.name
  FROM sales JOIN products ON (sales.product_id = product.id and sales.location = product.place_of_production)
  WHERE product.category = 'Cutlery';
Copy

例: ポイントルックアップフィルターと結合述語を使用したクエリ

通常のポイントルックアップフィルターと結合述語の両方を使用するクエリでは、検索最適化サービスにより両方のパフォーマンスを改善できます。次のクエリでは、検索最適化サービスにより sales.location ポイントルックアップ述語と product_id 結合述語を改善できます。

SELECT sales.date, product.name
  FROM sales JOIN products ON (sales.product_id = product.id)
  WHERE product.category = 'Cutlery'
  AND sales.location = 'Buenos Aires';
Copy

制限事項

検索最適化サービスおよび結合クエリには、以下の制限が適用されます:

  • 結合述語の論理和(OR)は現在サポートされていません。

  • LIKE、 ILIKE、 および RLIKE との結合述語は現在サポートされていません。

  • 現在、 VARIANT 列に対する結合述語はサポートされていません。

  • EQUAL_NULL 等式述語は現在サポートされていません。

  • 検索最適化サービスの現在の制限 も結合クエリに適用されます。