【问题标题】:Postgresql: The most efficient query for selecting "the highest lower" and "all higher"Postgresql:选择“最高低”和“所有高”的最有效查询
【发布时间】:2017-01-24 15:22:39
【问题描述】:

让我们有一个数据库表,例如。 g.:

t_times (id INTEGER, created TIMESTAMP WITHOUT TIME ZONE);

是否有可能编写一个查询来返回在给定日期之后创建的所有条目以及在给定日期之前创建的最新条目?

使用 UNION 可以轻松实现,但没有更快的方法吗?

SELECT * FROM t_times WHERE created >= ?
UNION
SELECT * FROM t_times WHERE created < ? ORDER BY created DESC LIMIT 1;

【问题讨论】:

  • union all 更快。

标签: sql database performance postgresql


【解决方案1】:

union all 更快:

(SELECT * FROM t_times WHERE created >= ?)
UNION ALL
(SELECT * FROM t_times WHERE created < ? ORDER BY created DESC LIMIT 1);

使用created 上的索引可能会更快一些:

select t.*
from t_times t
where t.created >= (select max(t2.created) from t_times where t2.created < ?);

这个想法是索引将用于子查询。 . .非常快。然后索引用于获取行。但是,这只是对union all 查询的轻微改进。

【讨论】:

  • 你说得对,UNION ALL 更快。但这当然不是重点。您提供的第二个选择每次都不会返回完全相同的结果(请注意原始查询中的 LIMIT 1,但对我来说非常有用)。无论如何,谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2016-04-04
  • 1970-01-01
相关资源
最近更新 更多