検索最適化で半構造化データのクエリを高速化¶
検索最適化サービスにより、Snowflakeテーブルの半構造化データ(VARIANT、 OBJECT、および ARRAY 列 のデータ)に対するポイントルックアップと部分文字列のクエリのパフォーマンスを向上させることができます。
検索最適化サービスの VARIANT サポートがテーブル内の列に対して構成されている場合、検索最適化サービスは自動的に VARIANT、 OBJECT、および ARRAY 列を検索アクセスパスに含めます。これは、構造が深くネストされ、構造が頻繁に変更される列にも当てはまります。また、半構造化列内の特定のフィールドに対する検索最適化を有効にすることもできます。
注釈
ON 句を使用した ALTER TABLE ... ADD SEARCH OPTIMIZATION コマンドで 特定の列に対してこの機能を明示的に有効にする必要があります。(テーブルレベルで検索最適化を有効にしても、 VARIANT 列では有効になりません。)例:
ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON EQUALITY(myvariantcol);
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c4:user.uuid);
ALTER TABLE mytable ADD SEARCH OPTIMIZATION ON SUBSTRING(myvariantcol);
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON SUBSTRING(c4:user.uuid);
ON 句を省略すると、 VARIANT 列に対するクエリは最適化されません。
次のセクションでは、このサポートについて詳しく説明します。
VARIANT 型の述語の定数およびキャストでサポートされるデータ型¶
検索最適化サービスにより、次の型が定数に使用され、要素に 暗黙的または明示的なキャスト が使用される 半構造化データのポイントルックアップ のパフォーマンスを向上させることができます。
FIXED (有効な精度とスケールを指定するキャストを含む)
INTEGER
TEXT
DATE (スケールを指定するキャストを含む)
TIME (スケールを指定するキャストを含む)
TIMESTAMP、 TIMESTAMP_LTZ、 TIMESTAMP_NTZ、 TIMESTAMP_TZ (スケールを指定するキャストを含む)
検索最適化サービスは、以下を使用した型のキャストをサポートしています。
VARIANT 値キャストを TEXT としてサポート¶
検索最適化サービスにより、 VARIANT 列が TEXT にキャストされ、 TEXT にキャストされる定数と比較されるポイントルックアップのパフォーマンスも向上させることができます。
たとえば、 src
が、 VARIANT に変換された BOOLEAN、 DATE、および TIME の値を含む VARIANT 列であるとします。
create or replace TABLE test_table
(
ID INTEGER,
SRC VARIANT
);
insert into test_table select 1, to_variant('true'::boolean); -- BOOLEAN
insert into test_table select 2, to_variant('2020-01-09'::date); -- DATE
insert into test_table select 3, to_variant('01:02:03.899213'::time); -- TIME
このテーブルの場合は、検索最適化サービスにより、 VARIANT 列を TEXT にキャストし、列を文字列定数と比較する次のクエリを向上させることができます。
select * from test_table where src::TEXT = 'true';
select * from test_table where src::TEXT = '2020-01-09';
select * from test_table where src::TEXT = '01:02:03.899213';
VARIANT 型のポイントルックアップでサポートされる述語¶
検索最適化サービスにより、以下にリストされている述語の型を使用してポイントルックアップクエリを向上させることができます。以下の例では、 src
は VARIANT 列であり、 path_to_variant_field
は VARIANT 列 のフィールドへのパスです。
次の形式の等価述語:
where path_to_variant_field[::target_data_type] = constant
この構文では、
target_data_type
(指定されている場合)、およびconstant
のデータ型は、 サポートされている型 のいずれかでなければなりません。たとえば、検索最適化サービスは以下をサポートしています。
要素を明示的にキャストせずに、要素を NUMBER 定数と一致させる。
where src:person.age = 42;
指定された精度とスケールで、要素を NUMBER に明示的にキャストする。
where src:location.temperature::NUMBER(8, 6) = 23.456789;
要素を明示的にキャストせずに、要素を TEXT 定数と一致させる。
where src:sender_info.ip_address = '123.123.123.123';
要素を TEXT に明示的にキャストする。
where src:salesperson.name::TEXT = 'John Appleseed';
要素を DATE に明示的にキャストする。
where src:events.date::DATE = '2021-03-26';
指定されたスケールで要素を TIME に明示的にキャストする。
where src:events.time_info::TIME(6) = '01:02:03.456789';
指定されたスケールで要素を TIMESTAMP に明示的にキャストする。
where src:event_logs.exceptions.timestamp_info(3) = '2021-03-26 15:00:00.123 -0800';
次のような ARRAY 関数を使用する述語:
where ARRAY_CONTAINS(constant::VARIANT, path_to_variant_field)
この構文では、
constant
は NULL であってはならず、constant
のデータ型は、 サポートされている型 のいずれかでなければなりません。例:
where ARRAY_CONTAINS('77.146.211.88'::VARIANT, src:logs.ip_addresses)
where ARRAYS_OVERLAP(ARRAY_CONSTRUCT(constant_1, constant_2, .., constant_N), path_to_variant_field)
各定数のデータ型 (
constant_1
、constant_2
など) は、 サポートされている型 のいずれかでなければなりません。構築された ARRAY には、NULL 定数を含めることができます。例:
where ARRAYS_OVERLAP( ARRAY_CONSTRUCT('122.63.45.75', '89.206.83.107'), src:senders.ip_addresses)
NULL 値をチェックする次の述語:
where IS_NULL_VALUE(path_to_variant_field)
IS_NULL_VALUE は JSON null値に適用され、 SQL NULL 値には適用されないことに注意してください。
where path_to_variant_field IS NOT NULL
where variant_column IS NULL
variant_column
は、半構造化データ内の要素へのパスではなく、列を参照します。たとえば、検索最適化サービスは VARIANT 列
src
の使用をサポートしていますが、その VARIANT 列にあるフィールドsrc:person.age
へのパスはサポートしていません。
VARIANT 型の部分文字列検索¶
検索最適化サービスは、 半構造化列 (ARRAY、 OBJECT、および VARIANT 列を含む)、またはそのような列のフィールドで、 ワイルドカードまたは正規表現検索 を最適化することができます。これには、以下を使用する述部が含まれます。
列または列内の複数のフィールドに対して部分文字列検索の最適化を有効にすることができます。たとえば、以下のステートメントは、列内のネストされたフィールドの部分文字列検索の最適化を有効にします。
ALTER TABLE test_table ADD SEARCH OPTIMIZATION ON SUBSTRING(col2:data.search);
検索アクセスパスが構築されると、以下のクエリを最適化することができます。
SELECT * FROM test_table WHERE col2:data.search LIKE '%optimization%';
しかし、次のクエリは、 WHERE 句フフィルターが検索最適化が有効なときに指定されたフィールド(col2:data.search
)に適用されないため、最適化されません。
SELECT * FROM test_table WHERE col2:name LIKE '%simon%parker%';
SELECT * FROM test_table WHERE col2 LIKE '%hello%world%';
最適化するフィールドは複数指定できます。ここでは、列 col2
にある2つの特定のフィールドに対して検索最適化が有効になっています。
ALTER TABLE test_table ADD SEARCH OPTIMIZATION ON SUBSTRING(col2:name);
ALTER TABLE test_table ADD SEARCH OPTIMIZATION ON SUBSTRING(col2:data.search);
指定したフィールドの検索最適化を有効にすると、すべてのサブフィールドで検索最適化が有効になります。最初のステートメントは、ネストされた search
フィールドを含む、 data
フィールド全体の検索最適化を有効にするため、以下の2番目の ALTER TABLE ステートメントは冗長です。
ALTER TABLE test_table ADD SEARCH OPTIMIZATION ON SUBSTRING(col2:data);
ALTER TABLE test_table ADD SEARCH OPTIMIZATION ON SUBSTRING(col2:data.search);
同様に、列全体の検索最適化を有効にすると、その列のすべての部分文字列検索が最適化されます。
VARIANT 部分文字列検索における定数の評価方法¶
クエリ内の定数文字列(例: LIKE 'constant_string'
)を評価する際、検索最適化サービスは以下の文字を区切り文字として文字列をトークンに分割します。
角括弧(
[
および]
)。中括弧(
{
および}
)。コロン(
:
)。コンマ(
,
)。二重引用符(
"
)。
文字列をトークンに分割した後、検索最適化サービスは5文字以上のトークンだけを考慮します。
述語の例 |
検索最適化サービスがクエリを処理する方法 |
---|---|
|
検索最適化サービスは、次の述語に対して検索アクセスパスを 使用しません。部分文字列が5文字より短いためです。 |
|
検索最適化サービスはこのクエリを最適化することができます。検索アクセスパスを使用して、 |
|
検索最適化サービスはこのクエリを最適化することができます。検索アクセスパスを使用して |
|
検索最適化サービスはこの文字列を |
|
検索最適化サービスはこれを |
|
検索最適化サービスはこの文字列を |
VARIANT 型のサポートにおける現在の制限事項¶
現在、検索最適化サービスにおける VARIANT 型のサポートには、次の制限があります。
XMLGET を使用する述語はサポートされていません。
形式
variant_field IS NULL
の述語はサポートされていません。定数がスカラーサブクエリの結果である述語はサポートされていません。
サブ要素を含む要素へのパスを指定する述語はサポートされていません。
検索最適化サービスの現在の制限 もこの機能に適用されます。