如何加快从sqlite数据库加载的速度?(sqlite3_step非常慢)

地位

我可能有大约1,000,000行要加载到C ++对象中(通过大约10,000个SELECTS)。我已经分析了负载,并注意到这里的sqlite3_step语句是瓶颈。

sqlite3_stmt *stmt;
std::string symbol = stock->getSymbol();
boost::format sql("SELECT date,open,high,low,close,volume FROM Prices WHERE symbol=\"%s\" ORDER BY date DESC");
sql % symbol;

if (sqlite3_prepare_v2(databaseHandle_, sql.str().c_str(), -1, &stmt, NULL) == SQLITE_OK) {
    while (sqlite3_step(stmt) == SQLITE_ROW) {
        int date = sqlite3_column_int(stmt, 0);
        float open = sqlite3_column_double(stmt, 1);
        float high = sqlite3_column_double(stmt, 2);
        float low = sqlite3_column_double(stmt, 3);
        float close = sqlite3_column_double(stmt, 4);
        int volume = sqlite3_column_int(stmt, 5);
        Price *price = new Price(new Date(date), open, close, low, high, volume);
        stock->add(price);
    }
} else {
    std::cout << "Error loading stock" << std::endl;
}

我正在使用amagalmated sqlite.h / c版本3.15.0。有什么想法可以提高性能吗?

更多信息:

CREATE TABLE Prices (symbol VARCHAR(10) NOT NULL, date INT(11) NOT NULL, open DECIMAL(6,2) NOT NULL, high DECIMAL(6,2) NOT NULL,low DECIMAL(6,2) NOT NULL, close DECIMAL(6,2) NOT NULL, volume INT(10) NOT NULL, PRIMARY KEY (symbol, date))

CREATE INDEX `PricesIndex` ON `Prices` (`symbol` ,`date` DESC)

EXPLAIN QUERY PLAN SELECT * FROM Prices WHERE symbol="TSLA" ORDER BY date DESC;

退货

SEARCH TABLE PRICES USING INDEX PricesIndex (symbol=?)

进一步的注意:上面所示的SELECT在Mac的SQLite浏览器中花费2毫秒执行SQL。

CL。

您的索引已经加快了搜索匹配行的速度,并以正确的顺序返回了它们,因此不需要单独的排序步骤。

但是,数据库仍然必须为每个索引条目查找对应的表行。您可以通过在所有使用的列上创建覆盖索引来加快此特定查询的速度

CREATE INDEX p ON Prices(symbol, date, open, high, low, close, volume);

但是,与其复制索引中的所有数据,不如使该表成为聚集索引是一个更好的主意

CREATE TABLE Prices (
    symbol VARCHAR(10) NOT NULL,
    date INT(11) NOT NULL,
    open DECIMAL(6,2) NOT NULL,
    high DECIMAL(6,2) NOT NULL,
    low DECIMAL(6,2) NOT NULL,
    close DECIMAL(6,2) NOT NULL,
    volume INT(10) NOT NULL,
    PRIMARY KEY (symbol, date)
) WITHOUT ROWID;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQLite sqlite3_step()与大型数据库挂起

来自分类Dev

sqlite3_step()如何工作?

来自分类Dev

SQLite3_step原因SEGFAULT

来自分类Dev

sqlite3_step始终返回SQLITE_DONE

来自分类Dev

使用SQLite3_Step在MapBox中看到CPU高峰

来自分类Dev

如何创建sqlite3数据库

来自分类Dev

如何创建sqlite3数据库

来自分类Dev

sqlcipher如何导入sqlite3数据库

来自分类Dev

如何从 SQlite 数据库加载所有数据?(离子 3、角 5、科尔多瓦)

来自分类Dev

SQLite-当(sqlite3_step(statement)== SQLITE_ROW)未执行时

来自分类Dev

SQLite 数据库

来自分类Dev

Java ResultSet减慢SQLite内存数据库的速度

来自分类Dev

SQLite 3数据库未更新

来自分类Dev

Python数据库sqlite3

来自分类Dev

从SQLite数据库加载HTML和从资产加载图像?

来自分类Dev

如何加密SQLite数据库

来自分类Dev

如何批量插入SQLITE数据库?

来自分类Dev

如何保护SQLite数据库?

来自分类Dev

如何清除SQLite数据库字段?

来自分类Dev

如何更改Sqlite数据库的模式?

来自分类Dev

如何加密SQLite数据库

来自分类Dev

如何识别ttk.Treeview加载数据的sqlite数据库表的名称?

来自分类Dev

如何使用RxJava从数据库将数据加载到RecyclerView中?(MVP + RxJava + SQLite)

来自分类Dev

如何将 SQLite 数据库查询中的数据加载到文本框中?

来自分类Dev

C ++处理sqlite3_prepare和sqlite3_step错误的正确方法

来自分类Dev

在调用sqlite3_step()时从sqlite3_stmt获取值

来自分类Dev

如何从SQLite Openhelper调试SQLite数据库?

来自分类Dev

为数据库适配器指定了sqlite3,但未加载gem

来自分类Dev

转储,然后为 WagTail 加载 sqlite3 数据库

Related 相关文章

热门标签

归档