検索最適化によるメリットを受け得るクエリの特定¶
検索最適化により、多くのクエリのパフォーマンスを向上させることができます。このトピックでは、検索最適化の恩恵を最も受けるクエリの種類と、逆に 恩恵を受けない クエリの種類の特徴について説明します。
一般的なクエリの特徴¶
検索最適化は、次の特性を持つクエリのパフォーマンスを向上させるのに最適です。
クエリには、主クラスターキー以外の列が含まれます。
通常、数秒以上実行されるクエリ (検索最適化の適用前)。ほとんどの場合、検索最適化によって、実行時間が1秒未満のクエリのパフォーマンスが大幅に向上することはありません。
クエリフィルター操作によってアクセスされる列の少なくとも1つは、100,000個以上の異なる値を持ちます。
個別の値の数を決定するには、次のいずれかを使用できます。
APPROX_COUNT_DISTINCT
を使用して、個別の値の概算数を取得します。select approx_count_distinct(column1) from table1;
COUNT(DISTINCT <列名>)
を使用して、個別の値における実際の数を取得します。select count(distinct c1), count (distinct c2) from test_table;
個別の値の概算数のみが必要なため、
COUNT(DISTINCT <列名>)
より高速で安価なAPPROX_COUNT_DISTINCT
の使用を検討してください。
サポートされているデータ型¶
検索最適化サービスは現在、次のデータ型をサポートしています。
固定小数点数(例: INTEGER、NUMERIC)。
DATE、 TIME、 TIMESTAMP
VARCHAR
BINARY
VARIANT、 OBJECT、および ARRAY。
GEOGRAPHY。
他のタイプの値 (すなわち、 FLOAT 、 GEOMETRY) を含むクエリは恩恵を受けません。
サポートされる述語タイプ¶
検索最適化は、この種の述語を使ったクエリのパフォーマンスを向上させることができます。
等号と IN を使用したポイントルックアップクエリ。
その他の改善の可能性¶
検索最適化によって、ビューや、 JOIN を使用するクエリのパフォーマンスを向上させることもできます。
ビュー¶
検索最適化サービスにより、ビュー(セキュアビューを含む)のパフォーマンスを間接的に改善できます。ビューのベーステーブルで検索最適化が有効になっていて、クエリがそのテーブルに選択的述語を使用している場合、検索最適化サービスは、行をフィルタリングするときのパフォーマンスを改善できます。 サポートされる述語タイプ をご参照ください。
ビュー内のすべてのテーブルで検索最適化を有効にする必要はありません。検索の最適化は、各テーブルで個別に実行されます。
結合¶
検索最適化サービスは、結合のパフォーマンスを直接改善しません。ただし、結合の前にいずれかのテーブルから行をフィルタリングするパフォーマンスを改善できます。この改善は、 サポートされる述語タイプ で説明されているように、テーブルが検索最適化を有効にしていて、述語が選択的である際に起こる場合があります。
両方のテーブルで検索最適化を有効にする必要はありません。検索最適化を使用するかどうかの決定は、テーブルごとに個別に行われます。
検索最適化の恩恵を受けないクエリ¶
現在、検索最適化サービスは、浮動小数点データ型、 GEOMETRY 、またはまだ説明されていないその他のデータ型をサポートしていません。Snowflakeには、将来さらに多くのデータ型のサポートが追加される可能性があります。
また、検索最適化サービスでは、次をサポートしていません。
外部テーブル。
動的テーブル。
マテリアライズドビュー。
COLLATE 句 で定義された列。
列の連結。
分析表現。
テーブル列にキャストします(文字列にキャストされる固定小数点数を除く)。
検索最適化は、定数値に対する暗黙的および明示的キャストを使用した述部をサポートしていますが、実際のテーブル列に値をキャストする述部はサポートしていません(INTEGER および NUMBER から VARCHAR へのキャストを除く)。
たとえば、次の述語は、定数値(テーブル列の値ではない)に対して暗黙的および明示的なキャストを使用するため、サポートされています。
-- Supported predicate -- (where the string '2020-01-01' is implicitly cast to a date) WHERE timestamp1 = '2020-01-01'; -- Supported predicate -- (where the string '2020-01-01' is explicitly cast to a date) WHERE timestamp1 = '2020-01-01'::date;
次の述語は、テーブル列の値に対するキャストを使用するため、サポートされていません。
-- Unsupported predicate -- (where values in a VARCHAR column are cast to DATE) WHERE to_date(varchar_column) = '2020-01-01';
検索最適化サービスは、キャスト後の値ではなく、元の列の値を考慮します。その結果、検索最適化サービスは、これらの述語を持つクエリには使用されません。
前述のように、このルールの例外は、テーブル列の NUMBER または INTEGER 値を VARCHAR 値にキャストする場合です。検索最適化サービスは、このタイプの述語をサポートします。
-- Supported predicate -- (where values in a numeric column are cast to a string) WHERE cast(numeric_column as varchar) = '2'
検索最適化はアクティブなデータに対してのみ機能するため、 Time Travel を使用するクエリのパフォーマンスは、検索最適化によっては向上しません。