2011-02-24 27 views
1

我們有一個Web服務方法,它接受一些數據並將其放入Lucene索引中。我們用它來從我們的asp.net web應用程序索引新的和更新的條目。將大型SQL Server數據庫重新綁定到Lucene

這些條目存儲在一個大的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個值的漏洞,它將在假設達到最終時停止索引,但這是我們現在必須生存的折衷。

任何人都可以提出一個更有效的方式從表中獲取數據索引?我認爲我們不是第一個面臨這個問題 - 搜索引擎如今被廣泛使用:)

+0

我認爲你需要澄清你的問題。是「lucene索引」lucene.apache.org?索引被破壞 - 這是一個SQL服務器索引嗎?你擔心你的20M行表中有序號嗎?此外,使用IDENT_CURRENT()的想法很有趣,但不一定會告訴你表中的行數 - 任何失敗的插入可以在序列中創建幻影間隙。 – EBarr 2011-02-24 20:54:16

+0

@EBarr:我真的不需要行數,而是首行和最後一行數,所以我可以從第一個循環到最後一個循環,每次循環獲取1000行。如果有差距,我會得到不到1000行,或者沒有 - 沒有什麼大不了的。 – Andrey 2011-02-24 21:11:25

+0

@EBarr:我在談論Apache的Lucene索引。 – Andrey 2011-02-24 21:12:53

回答

0

我其實只是想通了 - 我可以使用IDENT_CURRENT(表名),以獲得最後生成的ID,並用它來代替MAX()或Count() - 這個方法應該打擊其他兩個客場:)

0

爲什麼COUNT(*)是一個性能殺手? MAX(id)怎麼樣?我在想索引會提供這些查詢所需的信息。你的主鍵有索引,對嗎?

1

對於我們用Lucene做什麼,我們很少需要重新編制的一切。我不記得遇到任何情況下,所有的索引都會被損壞(Lucene實際上很安全/很好),但是由於某種原因需要對單個項目進行重新索引的情況很多次。我想說的最頻繁的重新索引模式是:由給定id

  • 重新索引項(或集ID)通過的時間一定時期內

後者,當然

  • 重新索引項,需要在相關的日期字段上有單獨的數據庫索引,這對於20M +記錄來說應該是有點昂貴的,但是我們決定去做(我們最大的部署有高達10M記錄),因爲現在磁盤空間很便宜。

    編輯:根據問題作者的評論添加了幾個解釋。

    如果源數據結構發生變化,需要對所有記錄進行重新索引,我們的方法是推出新代碼,以確保所有新數據都正確(從此時刻基本形成正確的Lucene Document)。然後,我們可以通過提供相關的週期範圍來分批重新索引事件(手動或手動)。這在某種程度上也適用於Lucene版本更改。

  • +0

    當我們決定進行一些與現有索引不兼容的模式更改時,我們已經在我們的測試環境中遇到了Lucene索引問題,這就是我們意識到我們需要完成重建索引的能力。 – Andrey 2011-02-25 04:09:00

    +0

    新增說明我們如何處理這些。 – mindas 2011-02-25 11:20:00

    相關問題