获取最新值 - 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 索引目前只能用于单向排序,这意味着根据您的访问需求,您可能还需要创建升序索引。
我有一个 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 索引目前只能用于单向排序,这意味着根据您的访问需求,您可能还需要创建升序索引。