私の質問はフルテキストの使用についてです。私が知っているように、%で始まるクエリはインデックスを使用しません:
SELECT * from customer where name like %username%
このクエリに全文を使用すると、パフォーマンスが向上しますか?SQL Serverは、%username%などのクエリにフルテキストインデックスの利点を使用できますか?
私の質問はフルテキストの使用についてです。私が知っているように、%で始まるクエリはインデックスを使用しません:
SELECT * from customer where name like %username%
このクエリに全文を使用すると、パフォーマンスが向上しますか?SQL Serverは、%username%などのクエリにフルテキストインデックスの利点を使用できますか?
SQL Server でインフィックス検索を実行する効率的な方法はありませんLIKE
。インデックス付きの列を使用したり、フルテキスト インデックスを使用したりすることはできません。
一般的なケースでは、LIKE 演算子に相当するフルテキストはありません。LIKE は文字列に対して機能し、ターゲット内のあらゆるものに対して任意のワイルドカード マッチを実行できますが、設計上、フルテキストは単語/用語全体に対してのみ機能します。(これは少し単純化されていますが、この回答の目的のために行います。)
SQL Server のフルテキストでは、接頭語演算子を使用した LIKE のサブセットがサポートされています。ドキュメントから ( http://msdn.microsoft.com/en-us/library/ms187787.aspx ):
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
LIKE
は、chainsaw、chainmail などの名前の製品を返します。機能的には、これは標準の演算子 ( ) よりも何も得られません。LIKE 'Chain%'
また、列にインデックスが付けられている限り、前置検索に LIKE を使用しても許容できるパフォーマンスが得られるはずです。
LIKE 演算子を使用すると、たとえばLIKE '%chain'
、ワイルドカードをどこにでも配置できます。これにより、インデックスが使用されなくなります。ただし、全文では、アスタリスクはクエリ用語の最後にしか表示されないため、これは役に立ちません。
LIKE を使用すると、新しい列を作成し、その値をターゲット列の逆に設定してインデックスを作成することで、効率的な後置検索を実行できます。次に、次のようにクエリを実行できます。
SELECT Name
FROM Production.Product
WHERE Name_Reversed LIKE 'niahc%'; /* "chain" backwards */
これは、名前が「chain」で終わる製品を返します。
次に、接頭辞と逆接尾辞のハックを組み合わせることができると思います。
SELECT Name
FROM Production.Product
WHERE Name LIKE 'chain%'
AND Name_Reversed LIKE 'niahc%';
(潜在的に)インデックス付き中置検索を実装していますが、特にきれいではありません(クエリオプティマイザーが計画で両方のインデックスを使用するかどうかを確認するためにこれをテストしたことはありません)。
インデックスがどのように機能するかを理解する必要があります。索引は百科事典の枯れ木版と全く同じです。
使用する場合:
SELECT * from customer where name like username%
全文または全文なしのインデックスが機能するはずです。しかし
SELECT * from customer where name like %username%
インデックスでは機能しません。時間のかかるクエリになります。
like と contains は大きく異なります -
次のデータ値を取得します
「ジョン・スミス」「サム・スミス」「ジョン・フラー」
「s%」「サム・スミス」など
like '%s%' 'john smith' 'sam smith'
「s」を含む
「ジョン」「ジョン・スミス」「ジョン・フラー」を含む
「s*」「john smith」「sam smith」を含む
contains sは、contains s* と同じものを返します。最初のアスタリスクは無視されます。これは少し面倒ですが、インデックスは単語であり、文字ではありません。
フルテキスト インデックスについて私が知っていることから、次の推定を行います。
すべてが正しいと仮定して、次のステートメントを作成します。フルテキスト インデックスは、実際にはインデックスであり、検索を高速化します。これは大きく、LIKE よりも検索の可能性が少なくなりますが、はるかに高速です。
詳細:
http://www.developer.com/db/article.php/3446891
http://en.wikipedia.org/wiki/Full_text_search
以下を使用できます。
SELECT * from customer where CONTAINS(name, 'username')
また
SELECT * from customer where FREETEXT(name, 'username')