【问题标题】:Reindexing a large SQL Server database to Lucene将大型 SQL Server 数据库重新索引到 Lucene
【发布时间】:2011-07-03 16:14:04
【问题描述】:

我们有一个 Web 服务方法,它接受一些数据并将其放入 Lucene 索引中。我们使用它来索引我们的 asp.net 网络应用程序中的新条目和更新条目。

这些条目存储在一个大型 SQL Server 表中(20M 行并且还在增长),我需要一种方法来重新索引整个表,以防当前索引被删除或损坏。我不确定从大表中检索大块数据的最佳方法是什么。目前,我们使用表具有自动增量 PK 的事实,因此我们得到 1000 行的块,直到它开始什么也不返回。有点像(伪语言):

i = 0
while (true)
{
    SELECT col1, col2, col3 FROM mytable WHERE pk between i and i + 1000
    .... if result is empty 20 times in a row, break ....
    .... otherwise send result to web service to reindex ....
    i = i + 1000
}

这样,我们不需要 SELECT COUNT(*) ,这将是一个很大的性能杀手,我们只需提高 pk 值,直到我们停止获得任何结果。这有它的缺点:如果我们在表中的某处有一个大于 20,000 个值的洞,假设它到达末尾,它将停止索引,但这是我们现在必须进行的权衡。

谁能提出一种更有效的方法来从表中获取数据到索引?我想我们不是第一个面临这个问题的人 - 搜索引擎现在被广泛使用:)

【问题讨论】:

  • 我认为您需要澄清您的问题。是“lucene 索引”lucene.apache.org 吗?索引被破坏——这是一个 SQL 服务器索引吗?您是否担心 20M 行表中有序列号?此外,您使用 IDENT_CURRENT() 的想法很有趣,但不一定会告诉您表中的行数 - 任何失败的插入都可能在序列中创建幻像间隙。
  • @EBarr:我真的不需要行数,而是第一个和最后一个行号,所以我可以从第一个到最后一个 id 循环并每次迭代获取 1000 行。如果有差距,我会得到少于 1000 行,或者没有 - 没什么大不了的。
  • @EBarr:我说的是 Apache 的 Lucene 索引。

标签: asp.net sql-server indexing lucene large-data-volumes


【解决方案1】:

对于我们使用 Lucene 所做的事情,我们很少需要重新索引所有内容。我不记得遇到过所有索引都会损坏的任何情况(Lucene 实际上非常安全/擅长于此),但是由于某种原因需要重新索引单个项目的情况已经很多次了。我想说最常见的重新索引模式是:

  • 根据给定的 id(或一组 id)重新索引项目
  • 按给定时间段重新索引项目

当然,后者需要在相关日期字段上使用单独的数据库索引,这对于 20M+ 记录来说应该有点贵,但我们决定使用它(我们最大的部署有多达 10M 记录)作为磁盘空间反正现在很便宜。

编辑:根据问题作者的评论添加了一些解释。

如果源数据结构发生变化,需要对所有记录进行重新索引,我们的方法是推出新代码以确保所有新数据都是正确的(从此时起基本上形成正确的 Lucene Document)。然后,我们可以通过提供相关的周期范围来批量(手动或手动)重新索引事物。这在一定程度上也适用于 Lucene 版本的变化。

【讨论】:

  • 当我们决定进行一些与现有索引不兼容的架构更改时,我已经在测试环境中遇到了 Lucene 索引问题,这就是我们意识到我们需要能够完成完整重新索引。
  • 添加了我们如何处理这些的说明。
【解决方案2】:

为什么 COUNT(*) 是性能杀手? MAX(id) 呢?我认为索引会提供这些查询所需的信息。你的主键上确实有一个索引,对吧?

【讨论】:

    【解决方案3】:

    实际上我只是想通了 - 我可以使用 IDENT_CURRENT(table_name) 来获取最后生成的 id,并使用它而不是 MAX() 或 Count() - 这种方法应该会吹走其他两个 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多