2016-06-28 177 views
0

在sqlite3中,說我有一個索引數據庫,其中通過索引我的意思是,所有表的行中的每個字符串信息已被替換爲整數,並且有一個表包含整數和字符串映射的所有表上的每個字段。sqlite3 - 將數據庫添加到索引數據庫和索引新行

現在我想添加到我的索引數據庫中的另一個數據庫,這個數據庫還沒有以這種方式處理 - 即仍然有行中的實際字符串。這些表具有完全相同的結構,因此對於新數據庫中的每個表,我將所有行添加到舊數據庫中相應的表中 - 但使用整數替換字符串w.r.t。舊數據庫中的字符串整數映射(並更新新數據庫中舊字符串中未顯示的那些字符串的映射)。

有沒有一種首選的方法來做到這一點?

該應用程序將是一個分佈式索引程序,我運行約。 10個作業用小數據庫填充FIFO隊列,我運行1個作業從隊列中選擇數據庫,爲它們編制索引並將它們添加到最終的大數據庫中。

回答

0

我從python訪問數據庫。

我最終所做的是將內存中的索引結構維護爲python對象,直到所有帶內容的整數行都被添加到新的數據庫。這使我可以通過executemany()函數進行批量插入。將所有行添加到數據庫後,將python索引對象批量插入到數據庫中。

與運行數據庫作爲索引結構相反,此功能非常快速。但是它至少有以下兩個缺點:

  1. 存儲的值不能索引表項的外鍵(但整數是沒有那麼大)

  2. 的(Python)的索引對象需要裝入內存(另一種語言的話,大概需要比它在蟒蛇更少的內存)

我必須說,我沒有嘗試使用SSD,這可能使基於內存的做法是不必要的。

1

的索引的表是這樣的:

CREATE TABLE data (ColX INTEGER, ColY INTEGER); 
-- foreign key constraints omitted 

讓我們假設索引表對字符串列的唯一約束:

CREATE TABLE ColX_strings (ID INTEGER PRIMARY KEY, Text TEXT UNIQUE); 
CREATE TABLE ColY_strings (ID INTEGER PRIMARY KEY, Text TEXT UNIQUE); 

然後,我們可以簡單地使用INSERT或忽略到只添加新的字符串,即不與任何舊字符串衝突的字符串:

INSERT OR IGNORE INTO ColX_strings(Text) SELECT ColX FROM newDB.data; 
INSERT OR IGNORE INTO ColY_strings(Text) SELECT ColY FROM newDB.data; 

現在所有的字符串都是已知的,所以我們可以簡單地在複製時查找它們:

INSERT INTO oldDB.data(ColX, ColY) 
SELECT (SELECT ID FROM ColX_strings WHERE Text = T.ColX), 
     (SELECT ID FROM ColY_strings WHERE Text = T.ColY) 
FROM newDB.data AS T; 
+0

謝謝。我認爲我們有相同的想法。但是你的代碼更清晰 - 我會嘗試一下並檢查速度增益。 –

+0

這是不是做了必要的兩倍選擇?首先創建索引結構,之後再查找整數。 –

+0

沒有什麼能阻止你用單個SELECT編寫代碼,並測量它會變得多快。 (並質疑是否值得付出努力。) –