5

例如,我有一张桌子Companies。其中有一个字段FullName,我在该字段上获得了全文索引。然后我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

我运行了一些测试来监控实际执行计划的“查询成本”。

似乎 CONTAINSTABLE 的总成本超过了用“AND”连接到搜索短语中的任意数量的词,等于这些词中不受欢迎的词的成本。

CONTAINSTABLE 对任意数量的带有“OR”的单词的总成本等于这些单词中最受欢迎的单词的成本。

这表明全文搜索引擎根据它们在索引中的流行度(出现次数)对搜索字符串中的单词进行优先排序。因此,我认为尝试在客户端上预订搜索字符串词没有任何好处。

这是我的全文搜索测试:

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]为您实际的全文索引表和字段名称,并设置@Word1@Word2为您的数据集中的流行词和后词。

于 2016-04-18T16:36:01.047 回答