FireBirdの検索高速化
使用しているバージョン
Firebird 3.0
やりたいこと
氏名(日本 太郎)のように登録されているテーブルAから
ユーザーによる検索条件(日本太郎、日本 太郎、日本 太郎)を抽出するSQLを作成したい
その際、テーブルAや検索条件に含まれているスペースを考慮しないように改修しヒット件数を増やしたい
※テーブルA及び検索条件の氏名の姓名間はスペースなし、半角スペース、全角スペースいずれも考えられる
課題点
思い当たる方法を使用したが、検索時間が長くなってしまうので高速化を行いたい
現在
LIKE句を使用(検索文字列後方のみ曖昧)
WHERE A.NAME LIKE '日本 太郎%'
→日本太郎、日本 太郎で検索した場合はヒットしない
→検索時間は平均0.06s
試したこと
①REPLACE
WHERE REPLACE(REPLACE(A.NAME , ' ', ''),' ','') LIKE '日本太郎%'
※LIKE後の文字列は呼び出し元プログラムでREPLACE
→検索時間が平均40sになってしまった
②SIMILAR TOを使用した正規表現
WHERE A.NAME SIMILAR TO '( | )?日( | )?本( | )?太( | )?郎%'
WHERE A.NAME SIMILAR TO '日([[:SPACE:]]| )?本([[:SPACE:]]| )?太([[:SPACE:]]| )?郎%'
→検索時間が平均11s
③LIKE句の条件拡張
WHERE A.NAME LIKE '%日%本%太%郎%'
→検索時間が平均9s
スペース以外も引っ張ってしまい検索結果が意図しないものになる可能性がある
質問内容(条件)
既に運用されており、テーブルの構造を変えるのは厳しいと言われておりますので、
Aテーブルに手を入れず、
試したこと以外でデータ量の多いテーブルAから高速でやりたいことを叶える記述方法の案があれば教えて欲しいです
また、外国人等、A.NAMEには複数のスペースが含まれる場合があります
マルチポストについて
当質問は前日にteratailにも投稿させていただいております。
理由:FireBirdがそこまでメジャーなDBではないため、広い範囲で有識者の方に見つけていただくため
片方で解決した際は可能な限り迅速に共有及び質問のクローズをさせていただきますので、何卒ご理解の程よろしくお願い致します。
teratail:https://teratail.com/questions/83edvco240m489
解決方法共有
WHERE A.NAME LIKE '日%' AND A.NAME SIMILAR TO '日( | )?本( | )?太( | )?郎%'
WHERE A.NAME LIKE '日%' AND REPLACE(REPLACE(A.NAME , ' ', ''),' ','') LIKE '日本太郎%'
taratailで案をいただき
上記のように先頭1文字で絞り込みの後にチェックを行った場合に0.09sで期待する結果を取得することができました。
ご回答、案をいただきありがとうございます!