use*_*479 6 c++ sqlite database-performance
我的问题直接来自这个问题,虽然我只对UPDATE感兴趣并且只对此感兴趣.
我有编写的应用程序中C/C++,这使得大量使用的SQLite,主要是SELECT/UPDATE,在一个非常频繁间隔(约20个查询每0.5至1秒)
我的数据库不大,此刻约有2500条记录,这里是表结构:
CREATE TABLE player (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(64) UNIQUE,
stats VARBINARY,
rules VARBINARY
);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我没有使用,transactions因为我正在改进代码并希望稳定而不是性能.
然后我通过仅执行10 update查询来测量我的数据库性能,以下(在不同值的循环中):
// 10 times execution of this
UPDATE player SET stats = ? WHERE (name = ?)
Run Code Online (Sandbox Code Playgroud)
其中stats一个JSON恰好是150个字符,name是5-10个字符.
没有交易,结果是不可接受的: - 大约1整秒(每个0.096)
随着交易,时间下降x7.5倍: - 约0.11 - 0.16秒(每个0.013)
我尝试删除数据库的大部分和/或重新排序/删除列,以查看是否有任何改变,但事实并非如此.即使数据库只包含100条记录(已测试),我也会得到上述数字.
然后我试着玩PRAGMA选项:
PRAGMA synchronous = NORMAL
PRAGMA journal_mode = MEMORY
Run Code Online (Sandbox Code Playgroud)
给了我较小的时间但不总是,更像是0.08 - 0.14秒
PRAGMA synchronous = OFF
PRAGMA journal_mode = MEMORY
Run Code Online (Sandbox Code Playgroud)
最后给了我非常小的时间大约0.002 - 0.003秒,但我不想使用它,因为我的应用程序每秒保存数据库,并且很有可能在操作系统/电源故障时数据库损坏.
我C SQLite的查询代码是:(省略了注释/错误处理/无关的部分)
// start transaction
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, NULL);
// query
sqlite3_stmt *statement = NULL;
int out = sqlite3_prepare_v2(query.c_str(), -1, &statement, NULL);
// bindings
for(size_t x = 0, sz = bindings.size(); x < sz; x++) {
out = sqlite3_bind_text(statement, x+1, bindings[x].text_value.c_str(), bindings[x].text_value.size(), SQLITE_TRANSIENT);
...
}
// execute
out = sqlite3_step(statement);
if (out != SQLITE_OK) {
// should finalize the query no mind the error
if (statement != NULL) {
sqlite3_finalize(statement);
}
}
// end the transaction
sqlite3_exec(db, "END TRANSACTION", NULL, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
如你所见,这是一个非常典型的TABLE,记录数量很小,而且我做了一个简单的简单UPDATE10次.我还能做些什么来减少我的UPDATE时间吗?我正在使用最新的SQLite 3.16.2.
注意:上面的时间直接来自单个
END TRANSACTION查询.查询是在一个简单的事务中完成的,我正在使用一个准备好的语句.
更新:
我在执行启用和禁用事务以及各种更新计数时执行了一些测试.我使用以下设置执行测试:
VACUUM;
PRAGMA synchronous = NORMAL; -- def: FULL
PRAGMA journal_mode = WAL; -- def: DELETE
PRAGMA page_size = 4096; -- def: 1024
Run Code Online (Sandbox Code Playgroud)
结果如下:
没有交易(10次更新)
没有交易(100次更新)
没有交易(1000次更新)
交易(10次更新)
交易(100次更新)
交易(1000次更新)
我的结论是,transactions没有任何意义time cost per query.也许随着更新次数的增加,时代变得越来越大,但我对这些数字并不感兴趣.单个交易的10到1000次更新之间几乎没有时间成本差异.但是,我想知道这是否是我的机器上的硬件限制,并不能做太多.~100使用单个事务并且即使使用WAL也可以使用10-1000次更新,我似乎不能低于毫秒.
没有交易,固定的时间成本大约是0.025几秒钟.
| 归档时间: |
|
| 查看次数: |
1894 次 |
| 最近记录: |