検索最適化による部分文字列と正規表現クエリの高速化

検索最適化により、テキストまたは半構造化データで部分文字列を検索する述語や正規表現を使用する述語を使用して、クエリのパフォーマンスを向上させることができます。半構造化データにおける部分文字列検索のしくみの詳細については、 検索最適化で半構造化データのクエリを高速化 をご参照ください。

以下のセクションでは、部分文字列クエリおよび正規表現クエリの検索最適化サポートに関する詳細情報を提供します。

部分文字列および正規表現クエリの検索最適化の有効化

テーブルに対する部分文字列クエリや正規表現クエリのパフォーマンスを向上させるには、特定の列に対して ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンド で ON SUBSTRING 句を使用します。

例:

ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON SUBSTRING(mycol);
Copy

詳細については、 検索最適化の有効化と無効化 をご参照ください。

サポートされている述語

検索最適化サービスは、述語を使ったクエリのパフォーマンスを向上させることができます。

検索最適化サービスは、5文字以上の部分文字列を検索する際のパフォーマンスを向上させます。(部分文字列をより選択的にすると、パフォーマンスが向上する可能性があります。)検索最適化サービスは次の述語に対して検索アクセスパスを使用 しません。部分文字列が5文字より短いためです。

LIKE '%TEST%'
Copy

次の述語の場合、検索最適化サービスにより、検索アクセスパスを使用して SEARCHOPTIMIZED の部分文字列を検索し、このクエリを最適化できます。ただし、検索アクセスパスは、部分文字列が5文字より短いため、 IS 用に使用されません。

LIKE '%SEARCH%IS%OPTIMIZED%'
Copy

テキストに対して RLIKE、 REGEXP、および REGEXP_LIKE を使用するクエリの場合、

  • subject 引数は、検索最適化が有効になっているテーブルの TEXT 列にする必要があります。

  • pattern 引数は文字列定数にする必要があります。

正規表現の場合、検索最適化サービスは次のときに最適に機能します。

  • パターンには、5 文字以上の部分文字列リテラルが少なくとも 1 つ含まれています。

  • パターンは、部分文字列が少なくとも1回出現する必要があることを指定する。

たとえば、次のパターンは、 string が件名に1回以上出現する必要があることを指定します。

RLIKE '(string)+'
Copy

各述語は、5文字以上の部分文字列が少なくとも1回は出現することを指定しているため、検索最適化サービスは以下のパターンを持つクエリのパフォーマンスを向上させることができます。(最初の例では、バックスラッシュ文字のエスケープを避けるために、 ドル引用符の文字列定数 を使用していることに注意してください。)

RLIKE $$.*email=[\w\.]+@snowflake\.com.*$$
Copy
RLIKE '.*country=(Germany|France|Spain).*'
Copy
RLIKE '.*phone=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
Copy

対照的に、検索最適化は、次のパターンのクエリに対して検索アクセスパスを使用しません。

  • 部分文字列のないパターン:

    RLIKE '.*[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
    
    Copy
  • 5文字より短い部分文字列のみを含むパターン:

    RLIKE '.*tel=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
    
    Copy
  • 選択肢の1つが5文字より短い部分文字列である交互演算子を使うパターン:

    RLIKE '.*(option1|option2|opt3).*'
    
    Copy
  • 部分文字列がオプションであるパターン:

    RLIKE '.*[a-zA-z]+(string)?[0-9]+.*'
    
    Copy

部分文字列リテラルが5文字より短い場合でも、正規表現を展開すると5文字以上の部分文字列リテラルが生成される場合、検索最適化サービスはクエリのパフォーマンスを向上させることができます。

たとえば、次のパターンを考慮します。

.*st=(CA|AZ|NV).*(-->){2,4}.*

この例では:

  • 部分文字列リテラル(例: st=CA など)は5文字より短いですが、検索最適化サービスは、部分文字列 st=CAst=AZst=NV (それぞれ5文字長)がテキストに表示されなければならないと認識します。

  • 同様に、部分文字列リテラル --> が5文字より短いにもかかわらず、検索最適化サービスは、(5文字より長い)部分文字列 -->--> がテキストに表示されなければならないと判断します。

検索最適化サービスは、検索アクセスパスを使用してこれらの部分文字列を照合できるため、クエリのパフォーマンスを向上させることができます。