网络百科 互联网 oracle分页 oracle数据库怎么实现分页?

oracle分页 oracle数据库怎么实现分页?

Oracle分页实现

闲来无事,整理下Oracle、mysql、mssql以及PG数据库的分页实现方式,大家可以简单做个对比,看下不同数据库在分页这块是怎么实现的。今天先介绍一下Oracle分页的实现方式。

oracle的分页一共有三种方式,但在Oracle中实现分页的方法主要是用ROWNUM关键字和用ROWID关键字两种。Rownum 和 Rowid是Oracle数据库所特有的,通过他们可以查询到指定行数范围内的数据记录。


1、根据rowid来分

Oracle使用rowid数据类型存储行地址,rowid是物理存在的,实际存在的一个列,是一种数据类型。 基于64为编码的18个字符来唯一标识的一条记录的物理位置的一个ID。而唯一标识出对应的存储的物理位置, 类似hashcode值。

rowid可以分成两种,分别适于不同的对象:

1)Physical rowids:存储ordinary table,clustered table,table partition and subpartition,indexe,index partition and subpartition
2)Logical rowids : 存储IOT的行地址

另一种rowid类型叫universal rowed(UROWID),支持上述physical rowid和logical rowed,并且支持非oracle table, 即支持所有类型的rowid, 但COMPATIBLE必须在8.1或以上.

每个表在oracle内部都有一个ROWID伪列,它在所有sql中无法显示,不占存储空间; 它用于从表中查询行的地址或者在where中进行参照,rowid伪列不存储在数据库中,它不是数据库数据,这是从database及table的逻辑结构来说的,事实上,在物理结构上,每行由一个或多个row pieces组成,每个row piece的头部包含了这个piece的address,即rowid.从这个意义上来说,rowid还是占了磁盘空间的。

我们在创建表时,可以为列指定为rowid数据类型,但oracle并不保证列中的数据是合法的rowid值,必须由应用程序来保证, 另外,类型为rowid的列需要6 bytes存储数据

一般实现分页的过程如下:

  • 1)获取数据物理地址:SELECT ROWID RID, tablenumber FROM table_name ORDER BY tablenumber DESC
    2)取得最大页数:SELECT ROWNUM RN, RID FROM (SELECT ROWID RID, tablenumber FROM table_name ORDER BY tablenumber DESC) WHERE ROWNUM <= xx
  • 3)取得最小页数:SELECT RID FROM(SELECT ROWNUM RN, RID FROM (SELECT ROWID RID, tablenumber FROM table_name ORDER BY tablenumber DESC) WHERE ROWNUM <= xx)
  • 4)因为取得的页数都是物理地址,再根据物理地址,查询出具体数据
--currentPage:当前页数
--pageSize:每页显示几条
SELECT *
  FROM table_name
 WHERE ROWID IN
       (SELECT RID
          FROM (SELECT ROWNUM RN, RID
                  FROM (SELECT ROWID RID, tablenumber
                          FROM table_name
                         ORDER BY tablenumber DESC)
                 WHERE ROWNUM <= ((currentPage - 1) * pageSize + pageSize)) 
         WHERE RN > ((currentPage - 1) * pageSize)) 
 ORDER BY tablenumber DESC;

2、按分析函数 ROW_NUMBER() OVER()来分

语法格式:row_number() over(partition by 分组列 order by 排序列 desc)

oracle中的ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内是连续且唯一的)

一般实现分页的过程如下:

--currentPage:当前页数
--pageSize:每页显示几条
SELECT *
  FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY tablenumber DESC) RK FROM t T)
 WHERE RK <= ((currentPage - 1) * pageSize + pageSize) 
   AND RK > ((currentPage - 1) * pageSize); 

3、根据rownum 来分

rownum是伪列,是在获取查询结果集后再加上去的 (获取一条记录加一个rownum)。对符合条件的结果添加一个从1开始的序列号

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。

一般实现分页的过程如下:

--currentPage:当前页数
--pageSize:每页显示几条
SELECT *
  FROM (SELECT T.*, ROWNUM RN
          FROM (SELECT * FROM t ORDER BY tablenumber DESC) T
         WHERE ROWNUM <= ((currentPage - 1) * pageSize + pageSize))
 WHERE RN > ((currentPage - 1) * pageSize);
返回顶部