2009-04-25 102 views
12

我有一個Sqlite3數據庫的表和一個主鍵組成的兩個整數,我試圖插入大量的數據到它(即約1GB左右)Sqlite3:插入時禁用主鍵索引?

我遇到的問題是創建主鍵也隱式地創建了一個索引,在我的情況下,在一些提交之後插入到爬行(這是因爲數據庫文件位於NFS .. 嘆息)。

所以,我想以某種方式臨時禁用該索引。到目前爲止,我的最佳計劃涉及刪除主鍵的自動索引,但似乎SQLite不喜歡它,並且如果我嘗試這樣做會引發錯誤。

我的第二個最佳計劃是讓應用程序在網絡驅動器上製作數據庫的透明副本,進行修改並將其合併回來。請注意,與大多數SQlite/NFS問題相反,我不需要訪問併發性。

什麼是正確的方式來做這樣的事情?

UPDATE:

我忘了,我已經在使用指定標誌:

PRAGMA synchronous = OFF 
PRAGMA journal_mode = OFF 
PRAGMA locking_mode = EXCLUSIVE 
PRAGMA temp_store = MEMORY 

更新2: 我其實分批將物品,但每下一批處理比前一個更慢(我假設這與索引的大小有關)。我嘗試了10k和50k元組之間的批處理,每個元組都是兩個整數和一個浮點數。

回答

10
  1. 您不能刪除嵌入索引,因爲它是唯一的行地址。
  2. 將您的2個整數鍵合併成單個長鍵=(鍵1 < < 32)+ key2;並且使本作中你幾乎架構中的INTEGER PRIMARY KEY(在這種情況下,你將有隻有1級指數)爲新的DB
  3. 設置頁面大小至少4096
  4. 刪除除主
  5. 資料填寫任何額外指數SORTED順序,以便主鍵不斷增長。
  6. 重用命令,沒有他們每個人的時間,從字符串創建
  7. 設置頁面緩存大小,以儘可能多的內存,你已經離開(記住,緩存大小爲頁數,而不是字節數)
  8. 承諾每50000個項目。
  9. 如果您有其他指標 - 創建它們只有在所有數據表

如果你將能夠合併鍵(我想你正在使用32位,同時採用64位sqlite的,所以這是可能的)並按排序順序填寫數據我敢打賭,你將填寫第一個Gb,其性能與第二個相同,並且速度不會太快。

6

你在做每個新的INSERT作爲單個交易嗎?

如果您批量使用BEGIN TRANSACTIONINSERT行,那麼我認爲索引只會在每次交易結束時重建。

+0

它會的。我也只是建議:) – 2009-04-25 10:44:49

+0

是的,但是我可以將整個千兆字節壓縮到一個事務中嗎?我幾乎這樣做是因爲意外(忘記將提交語句放在任何地方),並且我在中途得到了一些磁盤I/O錯誤,儘管我不確定它是否與其相關... – 2009-04-25 17:12:47