当ORACLE DB或SQLite DB中有很多行时,选择它们需要很长时间

bpzcxfmw  于 2023-03-23  发布在  SQLite
关注(0)|答案(1)|浏览(118)

您是说当您从数据库中选择满足某些条件的数据时,如果表中包含大量数据,则需要很长时间来执行选择操作。您正在寻找此问题的解决方案。对吗?
我的SQLite DB的大小是3GB,ANC_TB中的数据数量是100万。
这是我用C++写的代码。执行查询语句大约需要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);
9cbw7uwe

9cbw7uwe1#

你的 predicate 是:

WHERE UNIT_ID='%s' AND  CYCLE_NUM=%d AND FA_ID='%s'

假设所有这些都是高基数(大量的不同值)列,你应该对所有三个列都有一个索引。在不知道其他SQL可能会访问表或每列的基数的情况下,我真的不能建议确切的顺序,但至少把所有三个都放进一个索引中:

CREATE INDEX myindex ON mytable (unit_id,fa_id,cycle_num)

如果您要大量(数百万次执行)触发此SQL,那么您还可以将core_max_pin_burnup添加到索引列列表的 end,以避免完全命中表:

CREATE INDEX myindex ON mytable (unit_id,fa_id,cycle_num,core_max_pin_burnup)

它 * 必须 * 在最后,在你用于访问 predicate 的任何列之后。然而,如果你的执行量相对较低,这是不必要的,只是浪费空间。主要的事情是索引你的SQL有访问 predicate 的高基数列。
最后,我建议重写SQL以使用绑定变量,而不是将字符串与嵌入在字符串中的查找值串在一起。您将通过创建不可共享的游标导致共享池问题,这也会增加您的执行时间。

相关问题