PL/SQL FETCH NEXT 或 rownum

Tho*_*ian 2 sql oracle plsql

不多说,应该用什么?他们希望执行相同的任务。

行数?

select * from IDENTIFIKATOR
  where rownum <= 10;
Run Code Online (Sandbox Code Playgroud)

或者获取下一个?

select * from IDENTIFIKATOR
  FETCH NEXT 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

根据进一步的期望 rownum,表面上看起来可能会更快

select * from (select * from IDENTIFIKATOR order by IDENTIFIKATORID )
  where rownum <= 10;  
Run Code Online (Sandbox Code Playgroud)

基数为 10,成本为 10(普通执行时间为 0.15-0.2 秒(asc 与 desc))

select * from IDENTIFIKATOR 
order by IDENTIFIKATORID 
FETCH NEXT 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

基数为 10,成本为 158869(普通执行时间为 1.9s-2s(asc 与 desc))

Gor*_*off 5

如果您使用的是 Oracle 12c+,那么我建议您习惯该FETCH子句。它是 ANSI 标准语法,可在其他数据库中使用。另外,它更加灵活。例如,您可以这样做:

select i.*
from IDENTIFIKATOR i
order by col2 desc
fetch first 10 rows only;
Run Code Online (Sandbox Code Playgroud)

并且,它支持OFFSET修饰符。

rownum使用子查询来完成此操作。

另一方面,如果您的代码需要与早期版本的 Oracle 配合使用,那么rownum基本上是您唯一的选择。