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

Fetch most recent value - sql execution time too long

我有一个 Firebird 数据库 table 有两列:日期和值。

我想获取最新的值。问题是,这个 table 可以轻松超过 200k 行。我的 select 查询需要超过 400 毫秒,这对我的应用程序来说太长了。有什么办法可以加快速度吗?

我无法以任何方式更改数据库。我无法使用 Firebird 3.0 中引入的任何 window 函数。

这是我的查询:

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 连接层,如果这很重要的话。

我会尝试:

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) 上有一个索引。

您需要为列 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 将需要对整个结果集进行具体化和排序,然后才能 return 您得到第一行。这是低效的(如果结果集大于排序内存,可能会变得更糟,在这种情况下,Firebird 将在磁盘上的临时文件中排序)。

有了索引,Firebird 只需访问索引中的几个页面和 table 中的一个或多个记录即可找到您的事务可见的第一条记录。

注意:Firebird 索引目前只能用于单向排序,这意味着根据您的访问需求,您可能还需要创建升序索引。