SQL - 以更好的性能查找第n个最高金额

时间:2012-07-17 05:21:45

标签: sql

我知道,这是一个非常古老的问题,已经多次被问过了。

我想编写性能更好的查询,我们有超过2亿条记录,并且应该与数据库无关。

我尝试过以下查询

// MYSQL QUERY simillar to Oracle rownum(支持数据库:MYSQL,ORACLE,POSTGRESS)

SELECT RS.amt
FROM
(SELECT t.amount AS amt, 
       @rownum := @rownum + 1 AS rank
FROM salerecord t, 
       (SELECT @rownum := 0) r
ORDER BY t.amount DESC LIMIT 5) RS
WHERE RS.rank=5

//使用支持LIMIT的数据库,具有良好的性能(支持DB:MYSQL,Postgres)

SELECT amount FROM salerecord ORDER BY amount DESC LIMIT 4, 1;

//几乎所有DATABASES都没有良好的性能

SELECT amount FROM salerecord a WHERE 5 = (SELECT COUNT(*) FROM salerecord b WHERE a.amount <= b.amount) ;

1 个答案:

答案 0 :(得分:1)

在没有LIMIT或TOP运算符的情况下,没有有效的方法在SQL中执行此操作。

对于允许增量检索结果的系统,您可以通过获取前五个记录并简单地关闭连接来模拟所需的行为。

使用LINQ在.NET框架上构建的客户端软件可以使用Take运算符。

(以上假设您的示例所需维度的排名下降。)