7.15.13. in_values
¶
7.15.13.1. 概要¶
バージョン 4.0.7 で追加.
in_values
は 複数の OR
や ==
を使っているクエリを簡略化できます。複数の OR
や ==
を使うよりは in_values
を使うのがパフォーマンスの観点からおすすめです。
7.15.13.2. 構文¶
in_values
には2つ以上の引数を指定する必要があります。 target_value
を1つと 1つ以上の value
を指定します。
in_values(target_value, value1, ..., valueN)
in_values(target_value, value1, ..., valueN, {"option": "value of option"}
7.15.13.3. 使い方¶
使い方を示すために使うスキーマ定義とサンプルデータは以下の通りです。
サンプルスキーマ:
実行例:
table_create Tags TABLE_PAT_KEY ShortText
# [[0, 1337566253.89858, 0.000355720520019531], true]
table_create Memos TABLE_HASH_KEY ShortText
# [[0, 1337566253.89858, 0.000355720520019531], true]
column_create Memos tag COLUMN_SCALAR ShortText
# [[0, 1337566253.89858, 0.000355720520019531], true]
column_create Tags memos_tag COLUMN_INDEX Memos tag
# [[0, 1337566253.89858, 0.000355720520019531], true]
サンプルデータ:
実行例:
load --table Memos
[
{"_key": "Groonga is fast", "tag": "groonga"},
{"_key": "Mroonga is fast", "tag": "mroonga"},
{"_key": "Rroonga is fast", "tag": "rroonga"},
{"_key": "Droonga is fast", "tag": "droonga"},
{"_key": "Groonga is a HTTP server", "tag": "groonga"}
]
# [[0, 1337566253.89858, 0.000355720520019531], 5]
in_values
関数を使って tag
カラムの値が "groonga" 、 "mroonga" あるいは "droonga" であるものを選択する例を示します。
実行例:
select Memos --output_columns _key,tag --filter 'in_values(tag, "groonga", "mroonga", "droonga")' --sort_keys _id
# [
# [
# 0,
# 1337566253.89858,
# 0.000355720520019531
# ],
# [
# [
# [
# 4
# ],
# [
# [
# "_key",
# "ShortText"
# ],
# [
# "tag",
# "ShortText"
# ]
# ],
# [
# "Groonga is fast",
# "groonga"
# ],
# [
# "Mroonga is fast",
# "mroonga"
# ],
# [
# "Droonga is fast",
# "droonga"
# ],
# [
# "Groonga is a HTTP server",
# "groonga"
# ]
# ]
# ]
# ]
クエリを実行すると、"rroonga"を除いた結果を得られます。"rroonga"は in_values
には指定していないからです。
また、 in_values
はオプションも指定できます。現在は、 too_many_index_match_ratio
のみ指定できます。この値は、 double
型です。
too_many_index_match_ratio
を使って、 GRN_IN_VALUES_TOO_MANY_INDEX_MATCH_RATIO
の値を変更できます。GRN_IN_VALUES_TOO_MANY_INDEX_MATCH_RATIO
のデフォルト値は 0.01
です。GRN_IN_VALUES_TOO_MANY_INDEX_MATCH_RATIO
は、 in_values
がインデックスを使うかどうかを決定するために使います。
in_values
とANDで絞り込むと予想されるレコード数よりも、絞り込んだレコード数が十分に小さい場合は、インデックスを使った検索より、シーケンシャルサーチの方が速いことがあります。
例えば、 --filter
でレコードを絞り込んだあと、さらに in_values
で絞り込むとします。
デフォルトでは、以下のケースでは、 in_values
はシーケンシャルサーチを使います。
--filter
で絞り込んだレコード数が1000でin_values
対象のレコード数が500,000の場合。1,000/500,000 = 0.002 < 0.01(GRN_IN_VALUES_TOO_MANY_INDEX_MATCH_RATIO) -> in_values use sequential search.
一方、以下のケースでは、 in_values
はインデックスを使います。
--filter
で絞り込んだレコード数が1000でin_values
対象のレコード数が50,000の場合。1,000/50,000 = 0.02 > 0.01(GRN_IN_VALUES_TOO_MANY_INDEX_MATCH_RATIO) -> in_values use index.
in_values
のオプションを設定するクエリーは以下の通りです。:
実行例:
select Memos --output_columns _key,tag --filter 'in_values(tag, "groonga", "mroonga", "droonga", {"too_many_index_match_ratio":0.001})' --sort_keys _id
# [
# [
# 0,
# 1337566253.89858,
# 0.000355720520019531
# ],
# [
# [
# [
# 4
# ],
# [
# [
# "_key",
# "ShortText"
# ],
# [
# "tag",
# "ShortText"
# ]
# ],
# [
# "Groonga is fast",
# "groonga"
# ],
# [
# "Mroonga is fast",
# "mroonga"
# ],
# [
# "Droonga is fast",
# "droonga"
# ],
# [
# "Groonga is a HTTP server",
# "groonga"
# ]
# ]
# ]
# ]
7.15.13.4. 引数¶
二つ以上の引数が必須です。 target_valule
と 1つ以上の value
です。
7.15.13.4.1. target_value
¶
select
対象の table
に指定されたテーブルのカラムを指定します。
7.15.13.4.2. value
¶
選択したいカラムの値を指定します。
7.15.13.4.3. {"option": "value of option"}
¶
in_values
のオプションを指定します。現在は、 too_many_index_match_ratio
のみ指定できます。この値は、 double
型です。
7.15.13.5. 戻り値¶
in_values
は対象となるカラムに指定した値が含まれるかを返します。
もし該当するレコードがあれば、 true
を返します。そうでなければ false
を返します。