SQL Server; TEXT列上的索引

8
我有一个数据库表,其中有几列是VARCHAR(x)类型的列,其中一些列在其上具有索引,以便我可以快速搜索其中的数据。但是,其中一列是TEXT列,因为它包含了大量的数据(23kb的纯ASCII文本等)。我想能够在该列中搜索 (...WHERE col1 LIKE '%search string%'...), 但目前查询非常缓慢。我知道查询缓慢是因为这个列的搜索,因为当我从WHERE子句中删除该条件时,查询完成得非常快。我无法在该列上添加索引,因为SQL Server Management Studio的索引生成器/向导中该列的选项被灰色禁用了。那么,在这里加速对该列的查询搜索的选择是什么?感谢您的时间...
更新 好吧,我研究了全文搜索并做了所有的事情,现在我想运行查询。然而,当使用"contains"时,它只接受一个单词;如果我需要一个精确的短语怎么办?... WHERE CONTAINS (col1, 'search phrase') ... 抛出错误。
抱歉,我是 SQL Server 的新手。
更新2 抱歉,刚刚发现了这个问题;使用多个"contains"子句而不是一个包含多个单词的子句。实际上,这仍然不能得到我想要的结果(精确短语),它只是确保短语中的所有单词都存在。
5个回答

11

搜索文本字段通常很慢。尝试使用全文搜索,看看是否更有效。


链接已经失效,请尽可能修复! - Andreas
链接现在已经修复。 - Al W

5
如果您的查询类似于LIKE '%string%'(即在TEXT字段中搜索一个字符串内部),那么您将需要一个FULLTEXT索引。
如果您在字段开头搜索子字符串(LIKE 'string%')并使用SQL Server 2005或更高版本,则可以将您的TEXT转换为VARCHAR(MAX),创建计算列并对该列进行索引。
请参阅我博客中的这篇文章以了解性能详细信息:

4

您应该考虑在该列上使用全文索引。


0
自从没有人提过(也许是因为显而易见),查询LIKE '%string%'将绕过您现有的索引- 因此它会运行得很慢。 因此 - 这就是为什么您需要使用全文索引。 (这就是Quassnoi所说的)。
更正 - 我确信我学到了这一点,并始终相信它 - 但经过一些调查(在开头使用通配符),似乎没事?我的旧正则表达式查询使用likes更好!

0

在全文搜索中,您可以进行复杂的布尔查询,例如

contains(yourcol,'"我的第一个字符串"或"我的第二个字符串"和"我的第三个字符串"')

根据您的查询,ContainsTable或freetexttable可能会提供更好的结果。

如果您通过.Net连接,您可能需要查看Google全文搜索


我刚试了一下你的变化,但它并不起作用;首先,它需要使用 ' 而不是 ",其次,如果我在查询中使用 ' 或 ",添加第二个或多个单词就无法工作。 - user85116
我的错误,你需要在末尾加上一个单引号。语法是包含(*或colname,'“你的数据”和“一些其他数据”')http://msdn.microsoft.com/en-us/library/ms187787.aspx - u07ch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接