我的SQLite数据库的大小是3GB,ANC_TB
中的行数是100万。执行查询大约需要5秒:
db_mgr().ExecuteQuery(ToString(_T("SELECT CORE_MAX_PIN_BURNUP FROM ANC_TB WHERE UNIT_ID='%s' AND CYCLE_NUM=%d AND FA_ID='%s' ORDER BY CORE_MAX_PIN_BURNUP DESC LIMIT 1"),
pi().ucms,
itr->cycle,
itr->fa_id
)
.GetBuffer(0)
);
if (db_mgr().Start())
{
itr->a_Max_Pin_Burnup = db_mgr().Get_int(_T("CORE_MAX_PIN_BURNUP"));
}
如何将查询时间缩短到1秒以内?我尝试增加内存大小:
sqlite3_exec(mpDB, "PRAGMA cache_size=100000;", NULL, NULL, NULL);
1条答案
按热度按时间ctehm74n1#
你的 predicate 是:
假设所有这些都是高基数(许多不同的值)列,您应该对所有三个列都有一个索引。在不知道其他SQL可能会访问表或每列的基数的情况下,我不能真正建议确切的顺序,但至少将所有三个都放入索引中:
如果你正在大量地执行这个SQL(数百万次执行),那么你也可以通过将core_max_pin_burnup添加到索引列列表的 end 来避免完全命中表:
它 * 必须 * 放在最后,在您用于访问 predicate 的任何列之后。但是,如果您的执行量相对较低,则这是不必要的,并且只是浪费空间。主要的事情是索引高基数列,您的SQL在这些列上有访问 predicate 。
最后,我建议重写SQL以使用绑定变量,而不是将字符串与嵌入在字符串中的查找值串在一起。创建不可共享的游标将导致共享池问题,这也会增加执行时间。