5

たとえば、テーブルを取得しましたCompaniesFullNameその中に全文索引を取得したフィールドがあります。CONTAINSTABLE次に、そのテーブルに1 から 10 の単語を結合します@search_word"company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"...

*そして、単語 (バリアントを含む) がこの数の一致を得たことを知っています。

  • 会社 - 10k
  • 名前 - 5k
  • オイル - 2k
  • プロパン - 1k
  • 液体 - 500
  • 上記のすべての単語を 1 行に - 300 件の一致

したがって、その順序で検索すると、次のようになります。

@search = '"company*" AND "name*" AND "oil*" AND "propan*" AND "liquid*"'

そしてその順序で:

@search = '"liquid*" AND "propan*" AND "oil*" AND "name*" AND "company*"'

SELECT [FullName]
FROM dbo.Companies c
INNER JOIN CONTAINSTABLE (dbo.Companies, [FullName], @search) as s ON s.[KEY] = c.[KEY_FIELD];

クエリの速度に違いはありますか?

4

1 に答える 1

1

実際の実行計画の「クエリ コスト」を監視するいくつかのテストを実行しました。

「AND」で検索フレーズに結合された任意の数の単語に対する CONTAINSTABLE の全体的なコストは、それらの単語の中で最も人気のない単語だけのコストに等しいようです。

「OR」で結合された任意の数の単語に対する CONTAINSTABLE の全体的なコストは、それらの単語の中で最も人気のある単語だけのコストに等しくなります。

これは、全文検索エンジンが、インデックス内での人気度 (出現回数) に従って、検索文字列から単語に優先順位を付けていることを示唆しています。したがって、クライアントで検索文字列の単語を事前注文しようとしてもメリットはないと思います。

私の全文検索テストは次のとおりです。

Declare @Word1        nvarchar(50) = N'"Word1*"';
Declare @Word2        nvarchar(50) = N'"Word2*"';
Declare @SearchString nvarchar(100) = '';

PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' Start';
Set @SearchString = @Word1;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word2;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word1 + ' AND ' + @Word2;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word2 + ' AND ' + @Word1;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word1 + ' OR ' + @Word2;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;
Set @SearchString = @Word2 + ' OR ' + @Word1;
Select * From CONTAINSTABLE([Table], [Field], @SearchString);
PRINT SUBSTRING(CONVERT(varchar, SYSDATETIME(), 121), 12, 11) + ' ' + @SearchString;

[Table], [Field]実際のフルテキスト インデックス テーブル名とフィールド名に置き換え、 @Word1and@Word2をデータ セットの一般的な単語や後方単語に設定してください。

于 2016-04-18T16:36:01.047 に答える