文字成分表によるLIKEの高速化
2015年 10月 25日
1.
概要
Microsoft SQL Server などのデータベースで、SQL の LIKE 演算子を使用する文字列検索の処理速度を改善する方法です。
コンピューターの処理能力は、CPU が高速化しメモリ搭載量が増えることにより、日を追って向上しています。データベースの処理速度も速くなり、かなりの量のデータがあっても、一瞬で検索できるようになってきました。
とは言え、文字列検索は時間のかかる処理であり、レコード数が多くなると、それなりの時間が必要となります。
例えば、データ型が text の列に“明日”という語を含むレコードを SELECT するとします。総レコード数が数千程度であれば一瞬で終わり、検索にかかる時間でユーザーを待たせることは無いでしょう。しかし、数十万のレコードがある場合には、ユーザーを退屈させない方法を考えるべきかもしれません。
どうにかして、検索を高速化したいと思っても、SQL 文のチューニングやマシンの高速化には限界がありますし、データベースとは別に検索システムを導入するには新たな投資が必要になるかもしれません。
もし、既存のデータベースに少し手を加えるだけで検索速度を改善できるとしたら、たとえそれが、劇的な高速化ではなく検索時間を数分の1にする程度のものであったとしても、有用なものではないでしょうか。
文字成分表による検索は、フルテキスト検索(全文検索)の手法のひとつです。ここでは、それを応用し、通常のリレーショナル・データベース(テーブル型の DB )上に構築する方法をご説明します。
1.1. 検索に適したデータ
残念ながら、どのようなテキスト・データに対しても検索を高速化できるというわけではありません。
以下のような条件を満たすデータが対象となります。
-
検索対象となるテキストが短い
-
主に日本語(文字種の多い言語)である
『検索対象となるテキストが短い』というのは、検索するテーブル列に入っている文字列の長さが平均して短い、ということです。大きな制約になりますが、いたし方ありません。はっきり何文字以内というわけではありませんが、だいたい次のようなデータが適していると考えてください。
記事の見出し、人名、書名、会社名、俳句、短歌、短めな1行の文。
1.2. 高速化の効果
扱うデータの内容によって大きく異なりますが、処理時間が、概ね数分の1になるようであれば、成功と考えてください。
必ず10分の1以下になる、というような期待はしない方が良いでしょう。
1.3. この方法の特徴
-
検索漏れが無い
形態素解析を使用したフルテキスト検索では、検索漏れが発生することがありますが、この方法では検索漏れがありません。
普通に LIKE 演算子を使用した場合と同じ結果が得られます。
-
データベースだけで構築できる
別途、インデックス・ファイル等を使用する必要が無く、テーブルに列を追加するだけで構築できます。
-
レコードの追加、更新の際の負荷が少ない
-
データ量の増加が少ない
N-gram方式のように大きなインデックスを持たないので、増加するデータの量がわずかです。
-
組み込みが簡単
組み込みに必要となるのは、ほんの少しの新しいプログラム・コードと、検索対象のテーブルに関するSQL文の修正だけです。
プログラム言語も問いません。
欠点としては、
-
短い文字列でしか有効ではない
-
劇的に速くなるわけではない
-
処理速度にムラがある
と、言うようなところです。