SELECT MAX(col_name) 和 ROWNUM = 1 之间的性能

Posted

技术标签:

【中文标题】SELECT MAX(col_name) 和 ROWNUM = 1 之间的性能【英文标题】:Performance between SELECT MAX(col_name) and ROWNUM = 1 【发布时间】:2009-07-04 02:55:35 【问题描述】:

我怀疑以下查询的速度和结果。谁能给我解释一下? (这些查询是为 Oracle 数据库编写的)

假设我有一张表 table1(ID, itemID, trnx_date, balance, ...)。我想获取一个项目的最新余额。

查询 1:

SELECT balance FROM table1 WHERE ID = (SELECT MAX(ID) from table1 WHERE itemID = item_id);

查询 2:

SELECT balance FROM table1 WHERE itemID = item_id AND rownum = 1 按 ID DESC 排序;

其中 item_id 是变量。

那么,这两个查询给出相同的结果吗?哪个更快,或者有没有其他查询比他们更快?

谢谢

【问题讨论】:

【参考方案1】:

Oracle 中的Rownum 是在排序之前计算的(我之前的错误,我有点没用过Oracle)。因此,此查询与第一个查询相同:

SELECT 
    balance
FROM 
    (SELECT balance FROM table1 WHERE itemID = *item_id* ORDER BY ID DESC)
WHERE
    rownum = 1;

在这种情况下,给定 ID 上的索引,这可能会稍微快一些。

您为什么不自己运行它们来对它们进行基准测试?

【讨论】:

感谢 Eric 的回答,但据我所知,select 语句的处理顺序是 FROM、WHERE、ORDER BY 和 SELECT。因此,当找到条件时,它会停止查找记录(因为ROWNUM=1),然后对结果进行排序,所以结果不会相同。我又测试了一张表数据,结果不一样!!!

以上是关于SELECT MAX(col_name) 和 ROWNUM = 1 之间的性能的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基础入门学习查询表达式解析 SELECT

MySQL存储过程中使用SELECT …INTO语句为变量赋值

MAX3485芯片串口通信软件使用总结

技术分享 | check(col_name<;')为何把空格拒之门外

MySQL查询数据操作(DQL)

mysql字符串拼接