Firebird:创建选择最后一条记录的索引是什么?

时间:2017-10-02 08:18:18

标签: sql firebird

我选择表中记录子集的最后一条记录(通过时间戳字段),并希望创建一个有用的索引来加速查询。令我惊讶的是,我无法定义Firebird愿意使用的索引。另外,我没有在互联网上找到任何关于我的问题的例子或提示。所以,也许我在这里找到一些帮助。

我有一张这样的表

create table MDE_ST (
  ID            integer not null,
  RESOURCE_ID   integer not null,
  STARTTIME     timestamp not null,
  ...
  primary key (ID),
  foreign key (RESOURCE_ID) references RESOURCES
);

和像这样的查询

select *
from MDE_ST
where RESOURCE_ID = ?
order by STARTTIME desc
rows 1

我的问题是,查询真的很慢。 Firebird始终使用资源上的外键索引来执行查询。但是每个资源只有几十个资源,但有数万个记录。因此,Firebird会在资源记录中进行自然扫描。

我尝试索引

create index MDE_ST_ASC on MDE_ST (RESOURCE_ID, STARTTIME);

create desc index MDE_ST_DESC on MDE_ST (RESOURCE_ID, STARTTIME);

但没有任何改变。 Firebird始终使用外键的索引。在您提出之前:索引统计数据是最新的。

我的问题:我必须创建哪个索引才能加快查询速度?

2 个答案:

答案 0 :(得分:1)

create desc index MDE_ST_DESC on MDE_ST (STARTTIME);

答案 1 :(得分:0)

INDEX

  

Firebird中的所有索引都是单向的。索引可能是   从最低值到最高值(升序)或   从最高值到最低值(降序)。关键字   ASC [ENDING]和DESC [ENDING]用于指定方向   指数。默认索引顺序为ASC [ENDING]。它非常有效   在同一列上定义升序索引和降序索引   键集。

     

降序索引对于要经历的列非常有用   搜索高值(“最新”,“最大”等)

使用" ORDER BY" DESCENDING 您应该为此列使用降序索引。

换句话说,索引的方向应该与&​​#34;的顺序相同,顺序为"