关于Oracle分页

Connected to Oracle9i Enterprise Edition Release 9.2.0.6.0
Connected as dev

SQL>
SQL> SET timing ON;
SQL> CREATE TABLE test_table AS
  2    SELECT rownum x
  3      FROM dual
  4     START WITH rownum = 1
  5    CONNECT BY rownum <= 1000000;

Table created

Executed in 4.125 seconds

SQL> --89991至90000行
SQL> --A方法
SQL> SELECT *
  2    FROM (SELECT /*+ first_rows */
  3           x, rownum num
  4            FROM (SELECT x FROM test_table ORDER BY x DESC)
  5           WHERE rownum <= 90000)
  6   WHERE num >= 89991;

         X        NUM
---------- ----------
    910010      89991
    910009      89992
    910008      89993
    910007      89994
    910006      89995
    910005      89996
    910004      89997
    910003      89998
    910002      89999
    910001      90000

10 rows selected

Executed in 4.579 seconds

SQL> --B方法
SQL> SELECT *
  2    FROM (SELECT x, rownum num FROM (SELECT x FROM test_table ORDER BY x DESC))
  3   WHERE num BETWEEN 89991 AND 90000;

         X        NUM
---------- ----------
    910010      89991
    910009      89992
    910008      89993
    910007      89994
    910006      89995
    910005      89996
    910004      89997
    910003      89998
    910002      89999
    910001      90000

10 rows selected

Executed in 6.891 seconds

SQL> --1至10行
SQL> --A方法
SQL> SELECT *
  2    FROM (SELECT /*+ first_rows */
  3           x, rownum num
  4            FROM (SELECT x FROM test_table ORDER BY x DESC)
  5           WHERE rownum <= 10)
  6   WHERE num >= 1;

         X        NUM
---------- ----------
   1000000          1
    999999          2
    999998          3
    999997          4
    999996          5
    999995          6
    999994          7
    999993          8
    999992          9
    999991         10

10 rows selected

Executed in 1.844 seconds

SQL> --B方法
SQL> SELECT *
  2    FROM (SELECT x, rownum num FROM (SELECT x FROM test_table ORDER BY x DESC))
  3   WHERE num BETWEEN 1 AND 10;

         X        NUM
---------- ----------
   1000000          1
    999999          2
    999998          3
    999997          4
    999996          5
    999995          6
    999994          7
    999993          8
    999992          9
    999991         10

10 rows selected

Executed in 6.906 seconds

SQL> --999991至1000000行
SQL> --A方法
SQL> SELECT *
  2    FROM (SELECT /*+ first_rows */
  3           x, rownum num
  4            FROM (SELECT x FROM test_table ORDER BY x DESC)
  5           WHERE rownum <= 1000000)
  6   WHERE num >= 999991;

         X        NUM
---------- ----------
        10     999991
         9     999992
         8     999993
         7     999994
         6     999995
         5     999996
         4     999997
         3     999998
         2     999999
         1    1000000

10 rows selected

Executed in 6.703 seconds

SQL> --B方法
SQL> SELECT *
  2    FROM (SELECT x, rownum num FROM (SELECT x FROM test_table ORDER BY x DESC))
  3   WHERE num BETWEEN 999991 AND 1000000;

         X        NUM
---------- ----------
        10     999991
         9     999992
         8     999993
         7     999994
         6     999995
         5     999996
         4     999997
         3     999998
         2     999999
         1    1000000

10 rows selected

Executed in 6.469 seconds

SQL> DROP TABLE test_table;

Table dropped

Executed in 0.125 seconds

SQL> --我们可以看到,A方法优于B方法,
SQL> --特别是当分页查询的页数靠前的时候,速度差别很明显,
SQL> --只是分页在最后几页的时候,2种方法消耗的时间才差不多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值