【问题标题】:Fast SQL Server search on 40M text records快速 SQL Server 搜索 40M 文本记录
【发布时间】:2012-10-26 13:16:10
【问题描述】:

我有一个 SQL Server 2005 数据库,其中包含一个包含 4000 万条记录的表。每条记录都包含一列,该列存储以逗号分隔的关键字列表。每个关键字都是字母和数字的组合。关键字最长为 7 个字符,平均每条记录有 15 个关键字。关键字在行间不是唯一的。

我想搜索全部或部分关键字。

我创建了显示 328,245,708 个唯一键计数的全文索引。对于 4 个或更多字符的查询(在测试机器上约为 100ms),搜索效率还不错,但对于 3 个或更少字符的查询(最多 3s)则太慢了在测试机器上)。

我一直在尝试CONTAINSTABLECONTAINS'[query]*' 查询,结果相似。

我认为短查询的性能较慢,因为短词在不同记录中重复的频率更高。

对结果进行排序并不重要,我一直在尝试返回从CONTAINSTABLE 排序的TOP X 结果。这不能提供所需的性能。

对于简短的查询,我怎样才能使这个搜索更快?

【问题讨论】:

  • 我会重构表结构,使用关键字创建一个新表,并使用外键将其引用回原始表中的主键
  • 我支持 t-clausen.dk。您可以为每个不同的关键字创建一个带有 ID 的表,然后创建一个包含 rowID/KeywordID 对的表,以及现有表和对表之间的一对多关系。
  • 这会比关键字列上的全文索引带来性能提升吗?同样这样我会在搜索时面临重复结果可能性的问题。

标签: sql sql-server performance


【解决方案1】:

另一种选择是考虑规范化表结构,以便将数据记录放在一个表中,将标签放在另一个表中,并使用关联表将标签与数据记录相关联。这将允许您针对标签执行文本搜索,并简单地加入关联表以检索相关记录。

【讨论】:

  • 与关键字列上的全文索引相比有什么性能优势吗?
  • 当然。将标签分成单独的表的另一个好处是您可以在标签名称上创建索引。这可能会对文本搜索产生最深远的影响。
  • 在幕后不就是全文索引词——创建一个包含所有标签(词)的查找表吗?
  • 您将Full Text Search 的概念与Database Index 的概念混淆了。
【解决方案2】:

您可能希望将其连接到 SOLRSphinx 之类的东西,并让专用的文本搜索引擎处理搜索功能。

【讨论】:

  • 与 Sql Server 全文索引相比,我应该期望什么样的性能提升范围
  • @MRT 在这种情况下,也许快速谷歌(或必应)搜索会很有用?
  • 你建议我如何使用谷歌搜索来达到这个目的?
  • SOLR vs. Sphinx vs. SQL Server 全文搜索?
  • 感谢您为我指明正确的方向。找不到任何实际的比较数据,但已经实现了 SOLR,很可能我会坚持使用这个解决方案。我能够索引我的 4000 万条记录数据库,现在甚至可以在单词中间进行 1 个字符搜索(比我在 SQL Server 上的索引更详细),并且它在同一台测试机器上搜索效率很高。无论搜索查询有多长,查询时间都非常一致 - 大约 1 秒(同样,索引比我之前在 SQL Server 中的索引更彻底)。
猜你喜欢
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多