私の最初のコメント、コンピュータのフルネームは FirstName + ' ' + LastName のようなものだと思います -- クエリの名を「Carl%」、姓を「Gari%」のようにすることはできますか 情報収集が目的でした。答えてくれてありがとう。
私はこれを自分で試したことはありません (あなたの環境でのみ問題になります) が、contains ベースのクエリに like 句を追加して、クエリ プランを contains バージョンと比較することができます。
考えられるクエリは 3 つあります。明らかなクエリ
A Contains version -- your existing query
A Like Version -- as I commented
A Combined version -- using like and contains
フルインデックス検索を使用することが常に LIKE バージョンよりも高速であることについて、あなたが必ずしも正しいとは思いません。正しい答えは場合によると思うからです。
姓 (または名) にインデックスがある場合、「類似」バージョンはインデックス付きルックアップを実行する必要があります。キーの分布と一致するパーセンテージによって異なります。つまり、「Gari%」や「Carl%」よりも「G%」などの姓や「Carl%」などの名の検索は、姓のみでインデックスを作成する場合、はるかに遅くなります。そのため、検索キーが十分に長い場合、LIKE バージョンは、contains バージョンよりも高速になる可能性があります。何が最適かを確認するには、テストする必要があります。
組み合わせたバージョンが常に最良の選択であるか、少なくとも十分である可能性があります.しかし、以下の戦略に従う前に、まずこれを試してみたいと思います.
私が提案する全体的な戦略は次のとおりです。
ユーザーが少なくとも数文字入力するまで、インクリメンタル検索の使用を停止します。Web サイトのユーザーにとって実質的な価値がほとんどないため、パフォーマンス ヒットの多くを支払う可能性があります。提案として、少なくとも 3 文字を入力する前にインクリメンタル検索を実行しないでください。インクリメンタル検索の前に最小文字数がすでに必要であるとは言及していないためです。
これが拒否された場合、同じ基本戦略ですが、最後に入力された文字から NN ミリ秒が経過するか、入力された文字数> ある程度の長さになるまで、インクリメンタル検索を呼び出しません。実際、一部の姓は 2 文字しかないため、実際にはこの戦略を使用する必要があります。
同様に、ユーザーが使用していない無駄な検索を避けるために、ユーザーが新しい文字をすばやく入力している限り、長さに関係なくインクリメンタル検索はまったく行いません。
結合されたクエリが常に十分である場合を除き、検索結果を返すためにサーバーに 2 つの異なるストアド プロシージャを用意します。1 つは like バージョンで、もう 1 つは含むバージョンです。提供された名前の量に応じて、最良の結果が得られると予想されるバージョンを呼び出します。