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 …INTO语句为变量赋值