获取最新值-SQL执行时间太长

时间:2018-08-02 18:13:23

标签: sql firebird

我有一个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连接层。

2 个答案:

答案 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)上具有索引。