查询效率 - 从表中选择 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 中选择最新的元素

SQL查询:从表中删除除最新N之外的所有记录?

从表中的不同条件中选择COUNT

SQL Server:根据来自其他 2 个表的子查询从表中选择

仅从表中选择最新记录并使其快速,如何?

仅拥有最新数据并从表中删除其余数据的有效方法