我有一个Firebird数据库,其中的表具有两列:日期和值。
我想获取最新值。问题是,该表可以轻松拥有超过20万行。我的选择查询花费了超过400毫秒的时间,这对我的应用程序来说太长了。有什么办法可以加快速度吗?
我无法以任何方式更改数据库。我不能使用Firebird 3.0中引入的任何窗口功能。
这是我的查询:
SELECT REG_DATE_TIME,REG_VAL FROM TAB_REG_VAL
WHERE REG_DATE_TIME = (SELECT MAX(REG_DATE_TIME) FROM TAB_REG_VAL);
我也尝试过select first .. order by
,但是执行时间相似。
如果重要的话,我正在使用C#ado.net连接层。
答案 0 :(得分:2)
您需要为列REG_DATE_TIME
创建降序index:
create descending index idx_tab_reg_val_reg_date_time on TAB_REG_VAL(REG_DATE_TIME);
然后您可以使用
SELECT FIRST 1 REG_DATE_TIME,REG_VAL
FROM TAB_REG_VAL
ORDER BY REG_DATE_TIME DESC
没有索引,Firebird将需要具体化并排序整个结果集,然后才能返回第一行。这样效率低下(如果结果集大于排序内存,则可能更糟,在这种情况下,Firebird会在磁盘上的临时文件中排序)。
有了索引,Firebird只需访问索引中的几页以及表中的一个或多个记录,即可找到您的交易可见的第一条记录。
注意:Firebird索引当前只能用于单个方向的排序,这意味着,根据您的访问需求,您可能还需要沿升序创建索引。
答案 1 :(得分:0)
我会尝试:
SELECT FIRST (1) REG_DATE_TIME, REG_VAL
FROM TAB_REG_VAL
ORDER BY REG_DATE_TIME DESC;
在TAB_REG_VAL(REG_DATE_TIME, REG_VAL)
上具有索引。