我可能有大约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。
您的索引已经加快了搜索匹配行的速度,并以正确的顺序返回了它们,因此不需要单独的排序步骤。
但是,数据库仍然必须为每个索引条目查找对应的表行。您可以通过在所有使用的列上创建覆盖索引来加快此特定查询的速度:
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] 删除。
我来说两句