【发布时间】: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