oracle和mysql分页完成及原理ITeye - 乐橙lc8

oracle和mysql分页完成及原理ITeye

2019-01-11 02:21:48 | 作者: 书兰 | 标签: 分页,查询,句子 | 浏览: 2620

 

        假如咱们是经过JDBC的办法拜访数据库,那么就有必要依据数据库类型采纳不同的SQL分页句子,关于MySql数据库,咱们能够选用limit句子进行分页,关于Oracle数据库,咱们能够选用rownum的办法进行分页.

(1)MySql的Limit m,n句子

Limit后的两个参数中,参数m是开端下标,它从0开端;参数n是回来的记载数。咱们需求分页的话指定这两个值即可

(2)Oracle数据库的rownum

在Oracle数据库中,分页办法没有MySql这样简略,它需求依托rownum来完结.
Rownum表明一条记载的行号,值得注意的是它在获取每一行后才赋予.因而,想指定rownum的区间来获得分页数据在一层查询句子中是无法做到的,要分页还要进行一次查询.

SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
WHERE ROWNUM = 40
)
WHERE RN = 21

其中最内层的查询SELECT * FROM TABLE_NAME表明不进行翻页的原始查询句子。ROWNUM = 40和RN = 21操控分页查询的每页的规模。

上面给出的这个分页查询句子,在大多数状况具有较高的功率。分页的意图便是操控输出成果集巨细,将成果赶快的回来。在上面的分页查询句子中,这种考虑首要体现在WHERE ROWNUM = 40这句上。

选 择第21到40条记载存在两种办法,一种是上面比如中展现的在查询的第二层经过ROWNUM = 40来操控最大值,在查询的最外层操控最小值。而另一种办法是去掉查询第二层的WHERE ROWNUM = 40句子,在查询的最外层操控分页的最小值和最大值。这是,查询句子如下:

SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A 
)
WHERE RN BETWEEN 21 AND 40

比照这两种写法,绝大多数的状况下,榜首个查询的功率比第二个高得多。

这 是由于CBO优化形式下,Oracle能够将外层的查询条件推到内层查询中,以进步内层查询的履行功率。关于榜首个查询句子,第二层的查询条件WHERE ROWNUM = 40就能够被Oracle推入到内层查询中,这样Oracle查询的成果一旦超过了ROWNUM约束条件,就停止查询将成果回来了。

而 第二个查询句子,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即便推到最内层也没有含义,由于最内层查询不知道RN代表什么)。因而,对 于第二个查询句子,Oracle最内层回来给中间层的是一切满意条件的数据,而中间层回来给最外层的也是一切数据。数据的过滤在最外层完结,明显这个功率 要比榜首个查询低得多。

上面剖析的查询不仅仅是针对单表的简略查询,关于最内层查询是杂乱的多表联合查询或最内层查询包括排序的状况相同有用。 注:rownum首要完结有两个使命(rownum自身是虚列,也不是固定的)       1.获得榜首行数据       2.获得前n行数据
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表乐橙lc8立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章