全文搜索“包含”比“喜欢%”慢

时间:2010-11-02 11:59:03

标签: sql-server full-text-search contains sql-like

我在SQL Server 2008 x64上遇到全文索引问题。

我有三张桌子:

TableA有90 000行

表B有12 000 000行

TableC有22 000 000行

我用自动人口创建了FTS目录。

当我查询TableA时:

Select * from TableA where Contains(field1, '"j*"')

我看到11000条记录少于1秒

但是当我用相同的查询查询TableB或TableC时,我在2秒内看到250条记录。这显然很慢。

使用“like%”而不是“contains”的查询对于相同的表执行不到1秒。

由于大表B和C,问题是否存在? TableA成功查询。

也许这些表需要更多时间来建立索引? (但他们已经索引(填充)3天了)

一些细节:

对于表B和C,我总是看到“人口状态=处理通知”(9)

属性“TableFulltextDocsProcessed”总是增加

(我的SQL Server有一个镜像实例。)

1 个答案:

答案 0 :(得分:1)

我不知道你的包含查询是否真的使用了全文索引。我认为它必须进行全表扫描。因为我已经理解了不同语言的全文索引索引词和词干。你的查询

Select * from TableA where Contains(field1, '"j*"')

如果您使用

执行相同的搜索,则其中只有char' j '
Select field1 from TableA where Contains(field1, 'fish')

相比
Select field1 from TableA where field1 like '%fish%'

在这篇引文中,他们谈论了很多不是字符的单词。 SQL Server 2005 Full-Text Search: Internals and Enhancements

  

全文搜索允许快速和   基于关键字的灵活索引   查询存储在SQL中的文本数据   Server数据库。不像LIKE   谓词,只适用于   字符模式,全文查询   进行语言搜索   这些数据,用文字和文字操作   基于特定规则的短语   语言。

所以我想知道如果短语:'j'必须是与全文一起使用的语言中的单词,j *是否有效。 看到 CONTAINS (Transact-SQL)

  

指定单词或短语的匹配项   从指定的文本开始。   将前缀术语括在double中   引号(“”)并添加一个   结尾前的星号()   引号,使所有文字   从简单的术语开始   在星号之前指定   匹配。该条款应该是   以这种方式指定:CONTAINS(列,   ' “文本”')。星号匹配零,   一个或多个字符(根目录)   单词或短语中的单词或单词)

执行计划是什么样的?