oracle有limit功能吗

严格来说,Oracle 有两种方法获取前 N 行;一种是使用rownum,另一种是使用row_number()分析函数。

首先使用rownum最简单,但要小心排序陷阱。
例如,去年我们做电商报表项目时,直接使用 select <= 1 0 from emp where rownum 来获取前1 0行。
结果,rownum是在排序之前分配的,所以按部门排序时数据就完全乱了。
正确的做法是定义一个两层查询如 select from (emp order by dept_id) where rownum <=1 0 rownum <=1 0 去年调试这个漏洞花了一天半的时间。
注意 rownum 是一个整数;因此加 1 0 相当于取第 1 行到第 1 0 行而不进行四舍五入。

还有一点是row_number()更加灵活;但写作很短。
我去年做薪资分析的时候,使用的是 select from (select row_number() over(order by sal desc) as rn, emp. from emp) Between rn 1 and 1 0 。
可以精确控制分类。
但有一个非常重要的细节:row_number() 从 1 开始并递增。
它不会像rownum那样在排序前崩溃,因此适合复杂的情况。
但去年一位同事 rn <1>一个陷阱。

我以为 row_number() 比第一个 rownum 更高级,但后来发现这是错误的。
对于简单的需求,rownum 实际上更快。
另一件事是 Oracle 的 DBMS_Random 包还可以检索随机行。
去年抽奖的时候我们就尝试过,但是效果太差,我们就死掉了。

建议您根据需要进行选择:简单获取行数使用rownum,如果需要精确排序则使用row_number()。
然而,当金额超过一百万美元时,需要注意的是,这两种方法都很慢,必须考虑其他想法。

Mysql和Oracle区别(整理必备)

MySQL 使用 LIMIT 进行分页。
Oracle 使用 ROWNUM 或 OFFSET/FETCH。
MySQL 有 UNion。
Oracle 有 UNION/INTERSECT/MINUS。
MySQL 使用 INNER/LEFT/RIGHT/FULL JOIN。
Oracle 多遗留集成语法。
Oracle 完全支持 ACID 事务。
MySQL InnoDB 支持。
Oracle有分区和簇。
MySQL 有集群/复制。
这就是区别。
选择 MySQL 是为了易于使用,选择 Oracle 是为了提高性能。
不要忘记使用 InnoDB。

清楚理解限制(limit)系列

这说起来容易做起来难。
我来说说我遇到的坑吧。

去年之前,我在上海开发了一个新系统。
客户的要求非常高,他们必须同时让数千个用户在线。
我正在考虑。
想想看,如果有几千个用户同时连接数据库,会不会压垮服务器?我很快查了Oracle的文档,看到了SESSIONS和PROCESSES参数。

当时我算了一下,客户说峰值可以达到2 000个用户。
我只好加保险,还包括这些后台进程,比如LGWR、DBWR等等。
我就是这么算的。
我将 SESSIONS 参数设置为 2 2 00,将 PROCESSES 参数设置为 2 3 00。
结果如何?上线前一天晚上测试突然说无法连接并报最大会话数超出错误。

我当时就很困惑,这是怎么回事?我显然已经指望这一点了。
后来查了一下,原来后台有一个统计进程跑得很开心,占用了一两百会话资源。
你看,这些细节你需要多加注意!后来我调整了后台进程配置并添加了一些会话资源,我完成了。

让我们谈谈流程。
我曾经在深圳有一个旧系统,服务器是Windows。
客户表示,他们有时会运行一些外部脚本来与数据库交互。
我查了一下,嗨,原来在Windows上,Oracle默认是一个进程,所有的操作都运行在这个进程中。
Windows 上的 PROCESSES 参数有所不同。
它限制了线程的数量。
我当时就想,我必须要注意这一点。
如果有多个用户并且线程已满,新传入的请求将直接被挂起。
后来我把PROCESSES参数设置得高一点,并添加了一些监控,最后什么也没发生。

所以你看,这个参数设置不能只看数字,一定要结合实际环境。
如果你想一想,不同的系统和不同的操作系统有不同的限制。
你真的必须尝试一一调整它们。
这项工作真的不能仅仅通过阅读文档来完成,它需要实践经验。