首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取最近的值- sql执行时间太长

获取最近的值- sql执行时间太长
EN

Stack Overflow用户
提问于 2018-08-03 02:13:23
回答 2查看 128关注 0票数 0

我有一个Firebird数据库,其中有一个表,其中包含两列: Date和value。

我想要获取最新的值。问题是,这个表可以轻松地超过200k行。我的select查询耗时超过400ms,这对于我的应用程序来说已经很长了。有没有什么办法,我可以加快速度呢?

我不能以任何方式改变数据库。我不能使用Firebird 3.0中引入的任何窗口函数。

下面是我的问题:

代码语言:javascript
复制
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连接层,如果这很重要的话。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-03 03:08:49

您需要为列REG_DATE_TIME创建一个降序index

代码语言:javascript
复制
create descending index idx_tab_reg_val_reg_date_time on TAB_REG_VAL(REG_DATE_TIME);

然后,您可以使用

代码语言:javascript
复制
SELECT FIRST 1 REG_DATE_TIME,REG_VAL 
FROM TAB_REG_VAL
ORDER BY REG_DATE_TIME DESC

如果没有索引,Firebird将需要对整个结果集进行物化和排序,然后才能返回第一行。这是低效的(如果结果集大于排序内存,可能会变得更糟,在这种情况下,Firebird将在磁盘上的临时文件中排序)。

有了索引,Firebird只需要访问索引中的几页和表中的一条或多条记录,就可以定位对事务可见的第一条记录。

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

票数 2
EN

Stack Overflow用户

发布于 2018-08-03 02:29:30

我会尝试:

代码语言:javascript
复制
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)上建立索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51659891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档