検索最適化サービス

検索最適化サービスは、特定の種類のルックアップクエリや分析クエリのパフォーマンスを大幅に向上させることができます。フィルタリング述語の広範なセットがサポートされています (検索最適化によるメリットを受け得るクエリの特定 を参照)。

注釈

検索最適化を使用した場合と使用しない場合の実行時間を比較するチュートリアルを開始するには、 検索最適化を始めるにあたり をご参照ください。

検索最適化サービスは、テーブルに対する次を含む特定の型のクエリパフォーマンスを大幅に向上させることを目的としています。

検索最適化サービスの恩恵を受けられるクエリを特定したら、それらのクエリで使用される列とテーブルの 検索最適化を有効化 できます。

検索最適化サービスは、一般的にユーザーに透明性があります。クエリは、検索最適化を行わない場合と同様に機能します。高速になるものがあるだけです。しかし、検索最適化は、他の特定のテーブル操作に影響を与えます。詳細については、 検索最適化テーブルの使用 をご参照ください。

検索最適化サービスが機能する方法

検索クエリのパフォーマンスを向上させるために、検索最適化サービスは、 検索アクセスパス と呼ばれる永続的なデータ構造を作成および維持します。検索アクセスパスは、テーブルの列のどの値が、各 マイクロパーティション で見つかるかを追跡し、テーブルをスキャンするときに一部のマイクロパーティションをスキップできるようにします。

メンテナンスサービスは、検索アクセスパスの作成と維持を担当します。

  • 検索最適化を有効化すると、メンテナンスサービスにより、ルックアップを実行するために必要なデータが検索アクセスパスに作成され、入力されます。

    テーブルのサイズによっては、検索アクセスパスの構築に非常に多くの時間が必要になる場合があります。メンテナンスサービスはこの作業をバックグラウンドで実行し、テーブルにおけるいずれの操作も阻害しません。クエリは、検索アクセスパスが完全に構築されるまで高速化されません。

  • テーブル内のデータが更新されると(たとえば、新しいデータセットのロードや DML 操作によって)、メンテナンスサービスは自動的に検索アクセスパスを更新し、データへの変更を反映します。

    検索アクセスパスの更新中にクエリを実行した場合、クエリの実行速度が遅くなる場合がありますが、正しい結果を返します。

各テーブルのメンテナンスサービスの進行状況は、 SHOW TABLES の出力の search_optimization_progress 列に表示されます。新しく最適化されたテーブルでの検索最適化のパフォーマンス向上を測定する前に、テーブルは完全に最適化済みであるとこの列に表示されることを確認します。

検索アクセスパスのメンテナンスは透過的です。メンテナンスサービスを実行するための仮想ウェアハウスを作成する必要はありません。しかし、メンテナンスのためのストレージやコンピューティングリソースにはコストがかかります。コストの詳細については、 検索最適化のコスト見積もりおよび管理 をご参照ください。

クエリのパフォーマンスを最適化するその他のオプション

検索最適化サービスは、クエリのパフォーマンスを最適化するさまざまな方法の1つです。その他するテクニックは次のとおりです。

  • クエリアクセラレーション。

  • テーブルのクラスタリング。

  • 1つ以上のマテリアライズドビュー(クラスター化または非クラスター化)を作成します。

次のテーブルに示すように、これらにはそれぞれ異なる利点があります。

機能

サポートされているクエリ型

メモ

検索最適化サービス

検索最適化サービスは、 サポートされているデータ型 のこれらの型を検索するパフォーマンスを向上させることができます。

Query Acceleration Service

フィルターまたは集計のあるクエリ。クエリに LIMIT が含まれる場合、クエリには ORDER BY も含まれる必要があります。
フィルターは高度に選択的である必要があり、 ORDER BY 句のカーディナリティは低くする必要があります。

クエリアクセラレーションは、アドホック分析、予測不可能なデータ量のクエリ、
また、大規模なスキャンと選択的フィルターを使用したクエリとの作業に適しています。

クエリアクセラレーションと検索最適化は補完的です。どちらも同じクエリを高速化できます。 クエリアクセラレーションとの互換性 をご参照ください。

マテリアライズドビュー

  • 等価検索。

  • 範囲検索。

  • 並べ替え操作。

マテリアライズドビューを使用して、同じソーステーブル(またはそのテーブルのサブセット)に異なるクラスタリングキーを定義するか、フラット化された JSON またはバリアントデータを格納して、フラット化が1回だけで済むようにすることもできます。

マテリアライズドビューは、マテリアライズドビューに含まれる行と列のサブセットのみのパフォーマンスを向上させます。

テーブルのクラスタリング

  • 等価検索。

  • 範囲検索。

テーブルは、1つ以上の列または式を含むことができる単一のキーでのみクラスター化できます。

次の表は、これらの最適化のうちどれがストレージまたはコンピューティングコストを持つかを示しています。

ストレージコスト

コンピューティングコスト

検索最適化サービス

Query Acceleration Service

マテリアライズドビュー

テーブルのクラスタリング

1

1

再クラスタリングのプロセスでは、既存のパーティションが新しいパーティションに書き換えられるため、 Fail-safe ストレージのサイズが増加する可能性があります。(再クラスタリングは新しい行を導入するのではなく、既存の行を再編成するだけです)。詳細については、 再クラスタリングのクレジットおよびストレージへの影響 をご参照ください。

クエリアクセラレーションとの互換性

検索最適化と クエリアクセラレーション 併用して、クエリのパフォーマンスを最適化できます。まず、検索最適化により、クエリに不要な マイクロパーティション を削除できます。次に、 対象となるクエリ については、クエリアクセラレーションによって残りの作業の一部をサービスが提供する共有コンピューティングリソースにオフロードできます。

両方のサービスによって高速化されるクエリのパフォーマンスは、ワークロードと利用可能なリソースによって異なります。

データがあるテーブルの作成から始めます。

create or replace table test_table (id int, c1 int, c2 string, c3 date) as
select * from values
  (1, 3, '4',  '1985-05-11'),
  (2, 4, '3',  '1996-12-20'),
  (3, 2, '1',  '1974-02-03'),
  (4, 1, '2',  '2004-03-09'),
  (5, null, null,  null);
Copy

SEARCH OPTIMIZATION プロパティをテーブルに追加します。

alter table test_table add search optimization;
Copy

次のクエリでは、検索最適化サービスを使用できます。

select * from test_table where id = 2;
Copy
select * from test_table where c2 = '1';
Copy
select * from test_table where c3 = '1985-05-11';
Copy
select * from test_table where c1 is null;
Copy
select * from test_table where c1 = 4 and c3 = '1996-12-20';
Copy

次のクエリでは、暗黙的なキャストが列ではなく定数に対して行われるため、検索最適化サービスを使用できます。

select * from test_table where c2 = 2;
Copy

次のキャストはテーブルの列にあるため、検索最適化サービスを使用 できません

select * from test_table where cast(c2 as number) = 2;
Copy

IN 句は、検索最適化サービスによってサポートされています。

select id, c1, c2, c3
    from test_table
    where id IN (2, 3)
    order by id;
Copy

述語が検索最適化サービスによって個別にサポートされている場合は、述語を接続詞 AND で結合でき、検索最適化サービスによって引き続きサポートされます。

select id, c1, c2, c3
    from test_table
    where c1 = 1
       and
          c3 = TO_DATE('2004-03-09')
    order by id;
Copy

DELETE および UPDATE (および MERGE)でも、検索最適化サービスを使用することができます。

delete from test_table where id = 3;
Copy
update test_table set c1 = 99 where id = 4;
Copy