2017-07-03 80 views
0

使用僅包含特定表中的VARCHAR值的數據庫時,如何在更新此類表時提高性能?如何在SQLite上處理僅具有VARCHAR值的數據時提高性能?

我更新這樣的表的問題是,當獲取新數據時,必須決定是否要INSERTUPDATE這樣的行,但是對於至少有1000行以上的大表可以做什麼?

如果表格很小,我會發現只需執行SQL查詢就可以輕鬆查找新值是否已存在,並根據結果找到INSERTUPDATE。但是,如果你獲得100多條新的數據行,其中一些可能已經或可能不在數據庫中,有些可能是全新的,但我擔心這麼多的查詢會花費不必要的時間完成。

可以刪除數據庫中共享某個值的所有內容,比如說相同的日期,因爲新數據可能比單獨查詢每行更好?

實施例:

 1 2 3 ... 20 
01/01 A1 A2 A3 ... A20 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z2 Z3 ... Z20 

更新後:

 1 2 3 ... 20 
01/01 A4 A5 A6 ... A23 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z5 Z6 ... Z20 

實施例2:

 1 2 3 ... 20 
01/01 A1   ... A20 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1  Z3 ... Z20 

實施例2更新後:

 1 2 3 ... 20 
01/01 A4 A5 A6 ... A23 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z5 Z6 ... Z20 
+1

使用'INSERT OR REPLACE'。 – CommonsWare

+1

進一步使用基於事務的操作,因此您不必爲插入/替換的每個項目打開/關閉 – tyczj

+0

另一種方法是添加時間戳列,僅返回最後一行(針對每行),無需更新命令,並最終執行一個過程以除去每條記錄的最後一個時間戳。 –

回答

0

寫入比讀取更糟糕(因爲數據庫在修改表之前也必須讀取一些頁面),所以您應該避免執行實際上不需要的DELETE或REPLACE。

(替換語句總是刪除舊行(如果存在的話)插入新的人之前,所以它是作爲DELETE那樣糟糕。)

不要緊是否REPLACE語句或您自己的查詢搜索對於舊的行,所以如果不需要,可以自己去做,以避免INSERT。

當表正確時indexed的查找速度非常快,即在其值爲搜索使用的列上有索引時。

+0

這是我的第一個想法,但我不確定它是否會用我構建的編譯語句來處理事務中的所有事情。我發現它已經比使用單獨的INSERT更快,但我仍然需要選擇是「更新」還是「插入」。 – user1676874

+0

你的問題沒有提到已編譯的語句或事務。 –

+0

我知道,有人在對另一個答案的評論中提出了建議。我對此抱歉抱歉。 – user1676874