我在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有一个镜像实例。)
答案 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(列, ' “文本”')。星号匹配零, 一个或多个字符(根目录) 单词或短语中的单词或单词)
执行计划是什么样的?