検索最適化による部分文字列と正規表現クエリの高速化¶
検索最適化により、テキストまたは半構造化データで部分文字列を検索する述語や正規表現を使用する述語を使用して、クエリのパフォーマンスを向上させることができます。半構造化データにおける部分文字列検索のしくみの詳細については、 検索最適化で半構造化データのクエリを高速化 をご参照ください。
この機能には、次を使用する述語が含まれます。
注釈
ON 句を使用した ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドで特定の列に対してこの機能を有効にする必要があります。(テーブルレベルでの検索最適化を有効にしても、部分文字列検索は最適化されません。)例:
ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON SUBSTRING(mycol);
ON 句を省略しても、部分文字列検索は最適化されません。
検索最適化サービスにより、5文字以上の長さの部分文字列を検索する際のパフォーマンスを向上させることができます。(部分文字列をより選択的にすると、パフォーマンスが向上する可能性があります。)検索最適化サービスは、次の述語に対して検索アクセスパスを使用 しません。部分文字列が5文字より短いためです。
LIKE '%TEST%'
次の述語の場合、検索最適化サービスにより、検索アクセスパスを使用して SEARCH
と OPTIMIZED
の部分文字列を検索し、このクエリを最適化できます。ただし、部分文字列が5文字より短いため、 IS
には検索アクセスパスは使用されません。
LIKE '%SEARCH%IS%OPTIMIZED%'
テキストに対して RLIKE、 REGEXP、および REGEXP_LIKE を使用するクエリの場合、
subject
引数は、検索最適化が有効になっているテーブルの TEXT 列にする必要があります。pattern
引数は文字列定数にする必要があります。
正規表現の場合、検索最適化サービスは次のときに最適に機能します。
パターンには、5文字以上の部分文字列リテラルが少なくとも1つ含まれている。
パターンは、部分文字列が少なくとも1回出現する必要があることを指定する。
たとえば、次のパターンは、 string
が件名に1回以上出現する必要があることを指定します。
RLIKE '(string)+'
検索最適化サービスにより、次のパターンを使用するクエリのパフォーマンスを向上させることができます。これは、各述語が、5文字以上の部分文字列が少なくとも1回出現する必要があることを指定しているためです。(最初の例では、バックスラッシュ文字のエスケープを避けるために、 ドル引用符の文字列定数 を使用していることに注意してください。)
RLIKE $$.*email=[\w\.]+@snowflake\.com.*$$RLIKE '.*country=(Germany|France|Spain).*'RLIKE '.*phone=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
対照的に、検索最適化は、次のパターンのクエリに対して検索アクセスパスを使用しません。
部分文字列のないパターン:
RLIKE '.*[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
5文字より短い部分文字列のみを含むパターン:
RLIKE '.*tel=[0-9]{3}-?[0-9]{3}-?[0-9]{4}.*'
1つのオプションが5文字より短い部分文字列である代替演算子を使用するパターン:
RLIKE '.*(option1|option2|opt3).*'
部分文字列がオプションであるパターン:
RLIKE '.*[a-zA-z]+(string)?[0-9]+.*'
部分文字列リテラルが5文字より短くても、正規表現を展開すると5文字以上の部分文字列リテラルが生成される場合には、検索最適化サービスによりクエリのパフォーマンスを向上させることができます。
たとえば、次のパターンを考慮します。
.*st=(CA|AZ|NV).*(-->){2,4}.*
この例では、
部分文字列リテラル(例:
st=
、CA
など)は5文字より短いものの、検索最適化サービスは、部分文字列st=CA
、st=AZ
、またはst=NV
(それぞれ5文字の長さ)がテキストに出現する必要があることを認識します。同様に、部分文字列リテラル
-->
が5文字より短い場合でも、検索最適化サービスは、部分文字列-->-->
(5文字より長い)をテキストに出現する必要があると判断します。
検索最適化サービスは、検索アクセスパスを使用してこれらの部分文字列を照合できるため、クエリのパフォーマンスを向上させることができます。