検索最適化サービス

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

注釈

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

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

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

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

検索最適化サービスの仕組み

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

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

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

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

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

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

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

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

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

検索最適化サービスは、クエリのパフォーマンスを最適化するさまざまな方法の1つです。以下のリストにその他のテクニックを示します。

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

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

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

詳細については、 クエリパフォーマンスの最適化 をご参照ください。

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

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

ALTER TABLE を使用して 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