我有一个Firebird数据库,其中有一个表,其中包含两列: Date和value。
我想要获取最新的值。问题是,这个表可以轻松地超过200k行。我的select查询耗时超过400ms,这对于我的应用程序来说已经很长了。有没有什么办法,我可以加快速度呢?
我不能以任何方式改变数据库。我不能使用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连接层,如果这很重要的话。
发布于 2018-08-03 03:08:49
您需要为列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索引目前只能用于单一方向的排序,这意味着根据您的访问需求,您可能还需要创建一个升序方向的索引。
发布于 2018-08-03 02:29:30
我会尝试:
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)上建立索引。
https://stackoverflow.com/questions/51659891
复制相似问题