2012-10-30 131 views
1

我正在使用Qt database abstraction圖層與Sqlite3進行交互。SQLite更新100ms

int x = GetTickCount(); 
database.exec("UPDATE controls SET dtype=32 WHERE id=2"); 
qDebug() << GetTickCount()-x; 

表是:在〜100毫秒的更新時間

CREATE TABLE controls (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    internal_id TEXT, 
    name TEXT COLLATE NOCASE, 
    config TEXT, 
    dtype INTEGER, 
    dconfig TEXT, 
    val TEXT, 
    device_id INTEGER REFERENCES devices(id) ON DELETE CASCADE 
); 

結果!即使沒有別的訪問數據庫,並且該表中總共有3條記錄。

對我來說這似乎很荒謬。 10條記錄已經需要一秒鐘才能完成。這是我應該從sqlite期望的表現還是讓我感到困惑的地方? SELECT查詢速度足夠快〜1ms。


編輯1

所以它不是Qt的。

sqlite3 *db; 
if (sqlite3_open("example.db",&db) != SQLITE_OK) 
{ 
    qDebug() << "Could not open"; 
    return; 
} 

int x = GetTickCount(); 
sqlite3_exec(db, "UPDATE controls SET dtype=3 WHERE id=2",0,0,0); 
qDebug() << "Took" << GetTickCount() - x; 

sqlite3_close(db); 

這傢伙只需要相同的時間。

+2

您使用的交易?嘗試使用'database.transaction(),database.exec('update here'),database.commit()'。有時,如果你有任何未提交的更新語句掛起,這將減慢插入/更新 –

回答

4

當您訪問您的硬盤時,可能需要很長時間。

嘗試其中之一:

PRAGMA journal_mode = memory;
PRAGMA synchronous = off;

所以不會立即觸摸盤。

當使用得很好時,SQLite可以非常快速。您的小型數據庫的select語句是從緩存中回答的。

還有其他的方法來調整你的數據庫。看到這樣的其他問題: Improve INSERT-per-second performance of SQLite?

+0

太棒了。只需添加synchronous = off,就可以使GetTickCount無法測量的時間! – Ron

+0

'synchronous = off'意味着在UPDATE/INSERT期間,如果發生斷電,您將丟棄數據庫。 –

+0

看起來像,但表現真的很需要。災難性失敗的可能性很小。我要做的是在init之前存儲數據庫的副本。如果init成功,這將成爲下一次啓動的後備。由於這不是銀行應用程序,並且可以從環境重新創建數據(雖然速度很慢),所以應該可以。 – Ron