【问题标题】:Firebird: What index to create for selecting the last record?Firebird:为选择最后一条记录创建什么索引?
【发布时间】:2017-10-02 08:18:18
【问题描述】:

我选择表中记录子集的最后一条记录(通过时间戳字段),并希望创建一个有用的索引来加快查询速度。令我惊讶的是,我无法定义 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 总是使用外键的索引。在您问之前:索引统计信息是最新的。

我的问题:我必须创建什么索引来加快查询速度?

【问题讨论】:

  • 将您的查询更改为不使用SELECT *,优化器很可能会忽略您拥有的任何索引,因为它会按照它想要的方式读取所有内容。
  • @dbajtr:在真正的查询中没有select *。这里只是为了简化问题。
  • 要知道您需要什么索引来显示查询。如果您在 Resource_ID 上搜索但想要所有内容,那么只在该列上有一个索引是有意义的,如果不查看查询就不确定 Von 键的用途
  • 哦,对不起。在将代码翻译成英文时,我忘记了索引定义中的字段名称。编辑了我的问题。
  • 再一次,没有查看我假设的完整查询。我不认为STARTTIME 是必要的。因为您在 Resource_id 上搜索并获得更多列,它将使用 FK 搜索 ID,然后使用 key lookup 从表中获取其他列。如果您只想要这两列,但如果您想要更多,那将是有意义的

标签: sql firebird


【解决方案1】:

试试

create desc index MDE_ST_DESC on MDE_ST (STARTTIME);

【讨论】:

  • 谢谢。该指数做得更好。尤其是那些拥有一万条记录的resource_id(见我上面的评论)。
【解决方案2】:

INDEX

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

降序索引可用于将受制于的列 搜索高值(“最新”、最大值等)

当您使用“ORDER BY”DESCENDING时,您应该为此列使用降序索引。

也就是说index的方向应该和order by的方向一致

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多