查询效率 - 从表中选择 2 个最新的“组/批次”记录
Posted
技术标签:
【中文标题】查询效率 - 从表中选择 2 个最新的“组/批次”记录【英文标题】:query efficiency - select the 2 latest “group/batch” records from table 【发布时间】:2015-05-20 07:41:51 【问题描述】:我们测试了一个非常有趣的 SQL 查询。不幸的是,事实证明这个查询运行有点慢 - O(n2) - 我们正在寻找一个优化的解决方案,或者可能也是一个完全不同的解决方案?
目标:
We would like to get for:
- some customers ("record_customer_id"), e.g. ID 5
- the latest 2 "record_init_proc_id"
- for every "record_inventory_id"
http://www.sqlfiddle.com/#!9/07e5d/4
查询工作正常并显示正确的结果,但至少使用了两次全表扫描,如果要扫描的行太多,这当然很糟糕。
是否可以 (a) 首先选择特定日期范围内的所有 record_customer_id(s),保存该查询的结果,然后 (b) 在 SQL 中对这些保存的结果运行工作查询?
或者是否有一种完全不同的方法可以实现出色的性能?
非常感谢任何帮助!
【问题讨论】:
无法保证您的选择查询中的变量会按照您希望的顺序执行。@g:= t.record_customer_id g,
可以在 case
语句之前或之后进行评估。
您没有在该 sqlfiddle 中定义索引 - 真实表是否相同?如果是,那么添加一些可能真的对你有帮助。
@user1786423:是的,定义了索引。查询执行了两次表扫描。应该避免这种情况。
@pala:查询工作得很好。
正如我所说,没有任何保证。可能是,也可能不是。 see here
【参考方案1】:
我在Groupwise-Max blog 中给出了一个通用的 O(N) 解决方案
【讨论】:
以上是关于查询效率 - 从表中选择 2 个最新的“组/批次”记录的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL ,从 2 个表中选择,但仅从表 2 中选择最新的元素