oracle 如何将查询时间缩短到1秒以内?

w46czmvw  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(151)

我的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);
ctehm74n

ctehm74n1#

你的 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以使用绑定变量,而不是将字符串与嵌入在字符串中的查找值串在一起。创建不可共享的游标将导致共享池问题,这也会增加执行时间。

相关问题