Date: 2014-08-09
Summary: 有大量的數據要插入數據庫,但是每次只寫入一條在速度上很難接受。本文介紹了在sqlite數據庫中一次插入多條記錄的優化方法。
sqlite一次插入多條記錄的優化方法
問題
今天在使用sqlite向表中插入數據的時候發現,對于一次插入多條記錄的問題來說,insert into的執行速度慢到了無法接受。我在實際的使用中,想一次性插入200條記錄,要做1000次左右的插入,這樣的話,我每次都要把200條記錄的插入語句組織成一個長字符串,然后執行一次executeUpdate語句。沒想到插入操作這么慢,只好請教搜索引擎,看有沒有什么好辦法。
試驗
答案當然是有的。因為我一直使用的sql語句是類似MySQL的:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
根據網友的回復,只需要使用不同的語法,在SQLite中把插入語句重寫成:
INSERT INTO 'tablename'
SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION SELECT 'data3', 'data4'
UNION SELECT 'data5', 'data6'
UNION SELECT 'data7', 'data8'
我把原來的代碼改成新的代碼以后,發現速度明顯是快多了!簡單做了一下測試,原來的方法做10次插入操作,每次寫入如200條數據已經需要222137ms,新的方法做同樣的操作只需要1841ms,這到底是什么節奏?
查看了一下SQLite的官方文檔,原來insert 還真有這種用法的。
SQLite insert
sqlite insert
而且官方文檔上面很明確的說明,insert語句有三種基本的形式,但是性能上為什么會有如此大的差別?這個還真是沒有想明白。。。
怎樣檢查一個表是否存在
另外順便記一下,在SQLite中查詢一個表是否存在的方法:
SELECT name FROM sqlite_master WHERE type='table' AND name='table_name';
table_name就是傳進去要查找的表的名字,當然也可以不要。這個語句會返回數據庫中的表名字哦!
參考
http://stackoverflow.com/questions/1601151/how-do-i-check-in-sqlite-whether-a-table-exists