23

私の質問はフルテキストの使用についてです。私が知っているように、%で始まるクエリはインデックスを使用しません:

SELECT * from customer where name like %username%

このクエリに全文を使用すると、パフォーマンスが向上しますか?SQL Serverは、%username%などのクエリにフルテキストインデックスの利点を使用できますか?

4

6 に答える 6

44

簡潔な答え

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%';

(潜在的に)インデックス付き中置検索を実装していますが、特にきれいではありません(クエリオプティマイザーが計画で両方のインデックスを使用するかどうかを確認するためにこれをテストしたことはありません)。

于 2010-12-01T06:34:15.563 に答える
3

インデックスがどのように機能するかを理解する必要があります。索引は百科事典の枯れ木版と全く同じです。

使用する場合:

SELECT * from customer where name like username%

全文または全文なしのインデックスが機能するはずです。しかし

SELECT * from customer where name like %username%

インデックスでは機能しません。時間のかかるクエリになります。

于 2010-11-16T13:44:19.297 に答える
0

like と contains は大きく異なります -

次のデータ値を取得します

「ジョン・スミス」「サム・スミス」「ジョン・フラー」

「s%」「サム・スミス」など

like '%s%' 'john smith' 'sam smith'

「s」を含む

「ジョン」「ジョン・スミス」「ジョン・フラー」を含む

「s*」「john smith」「sam smith」を含む

contains sは、contains s* と同じものを返します。最初のアスタリスクは無視されます。これは少し面倒ですが、インデックスは単語であり、文字ではありません。

于 2016-05-05T15:34:58.310 に答える
0

フルテキスト インデックスについて私が知っていることから、次の推定を行います。

  1. インデックスを作成すると、テキストが解析され、単語が検索され (MySQL などの一部の RDBMS では、3 文字を超える単語のみが考慮されます)、その単語がインデックスに配置されます。
  2. フルテキスト インデックスを検索するときは、単語を検索し、その単語を行にリンクします。
  3. 最初の 2 つ (MSSQL の場合) が正しければ、4 文字以上の長さの WORDS を検索した場合にのみ機能します。「chair」を検索しても「armchair」は見つかりません。

すべてが正しいと仮定して、次のステートメントを作成します。フルテキスト インデックスは、実際にはインデックスであり、検索を高速化します。これは大きく、LIKE よりも検索の可能性が少なくなりますが、はるかに高速です。

詳細:
http://www.developer.com/db/article.php/3446891
http://en.wikipedia.org/wiki/Full_text_search

于 2010-11-16T13:20:05.383 に答える
-1

以下を使用できます。

SELECT * from customer where CONTAINS(name, 'username')

また

SELECT * from customer where FREETEXT(name, 'username')
于 2019-06-22T06:50:24.667 に答える