2012-01-22 31 views
3

我有一個龐大的數據庫,它的目的是爲了索引,我在其中插入大量的信息,分解成一千個塊。每次插入索引都會更新。問題在於,由於這些巨大的交易導致日記文件上升到超過300兆字節,所以插入信息所需的時間在大約100周左右後變得非常長。有沒有辦法推遲更新索引?

有沒有辦法推遲更新索引(可能使用FREEZE INDEX命令或其他什麼),索引會在模式中保持定義狀態,並且在所有表填充後,可能會解凍並更新它。

我知道這可以通過DROP INDEXCREATE INDEX完成,但我正在尋找一個更優雅的解決方案,或者可能是一個技巧。

不幸的是,我無法輕易更改DBMS,或者我會使用PostgreSQL進行調查。

回答

3

除了它不「優雅」之外,還有什麼其他的原因你不想使用DROP INDEX/CREATE INDEX。我假設您在計劃維護期間正在執行此批量加載?在批量數據加載中,DROP INDEX/CREATE INDEX是非常標準的過程。通過在最後重新創建非聚集索引,確保數據庫可以創建最高效的索引結構(從而使查詢更快地運行)。

某些數據庫具有額外的功能來隱藏這些細節(SQL服務器允許您「禁用/啓用」索引),但在幕後他們仍然有效地執行DROP INDEX/CREATE INDEX。

同樣,即使存在「FREEZE INDEX」,也不會保存任何內容。如果你輸入了大量的數據,最好在最後徹底重建索引(這實際上就像是「DROP INDEX/CREATE INDEX」一樣)。

如果你的日誌變得太大,也許你應該將插入分割成更小的事務塊?

+0

儘管如果在事務中完成,sqllite將只在事務提交時更新索引。同時該索引仍可用於其他查詢,這似乎是一個最佳解決方案。 – Ilion

+0

@llion「其他查詢」? SQLite並不知道能夠充分處理並行查詢;一旦你開始一個改變數據的事務,數據庫將被鎖定到其他查詢,直到該數據庫完成。 – amphetamachine

1

您希望在事務內運行插入(或與事務批處理)。索引將在您提交後更新。

相關問題