FIRST OF ALL:

  论效率,还是ROWID的高(Oracle11g+版本).经过几轮测试,发现使用ROWID进行分页,特别是页数很大的情况下,效率能提高十倍多.so,Mark下代码:

SELECT name, age, gender, grade, class, score
  FROM students
WHERE ROWID IN (
  SELECT rid
    FROM (
      SELECT ROWNUM rn, rid
        FROM (
          SELECT ROWID rid
            FROM students WHERE age > 20 ORDER BY score DESC
      ) WHERE ROWNUM <= 300010
    ) WHERE rn >= 300001
) ORDER BY score DESC;

  由于上述写法比较麻烦,而且一般情况下也没人会一页一页的翻到几十万页来看个东西.so,日常使用的还是ROWNUM,对于靠前的页数查询,其效率和ROWID差不很多. 代码:

SELECT * FROM (
  SELECT t.*, ROWNUM as rn FROM (
    SELECT * FROM T_DUAL WHERE ... ORDER BY XXX
  ) t
) WHERE rn BETWEEN 11 AND 20;

1.无ORDER BY排序的写法。(效率最高)

经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!

sql语句如下:

SELECT *
FROM (Select ROWNUM AS ROWNO, T.*
from k_task T
where Flight_date between to_date('', 'yyyymmdd') and
to_date('', 'yyyymmdd')
AND ROWNUM <= 20) TABLE_ALIAS
WHERE TABLE_ALIAS.ROWNO >= 10;

2.有ORDER BY排序的写法。(效率最高)

经过测试,此方法随着查询范围的扩大,速度也会越来越慢!

sql语句如下:

SELECT *
FROM (SELECT TT.*, ROWNUM AS ROWNO
FROM (Select t.*
from k_task T
where flight_date between to_date('', 'yyyymmdd') and
to_date('', 'yyyymmdd')
ORDER BY FACT_UP_TIME, flight_no) TT
WHERE ROWNUM <= 20) TABLE_ALIAS
where TABLE_ALIAS.rowno >= 10;

3.无ORDER BY排序的写法。(建议使用方法1代替)

此方法随着查询数据量的扩张,速度会越来越慢!

sql语句如下:

SELECT *
FROM (Select ROWNUM AS ROWNO, T.*
from k_task T
where Flight_date between to_date('', 'yyyymmdd') and
to_date('', 'yyyymmdd')) TABLE_ALIAS
WHERE TABLE_ALIAS.ROWNO <= 20
AND TABLE_ALIAS.ROWNO >= 10;
TABLE_ALIAS.ROWNO between 10 and 100;

4.有ORDER BY排序的写法.(建议使用方法2代替)

此方法随着查询范围的扩大,速度也会越来越慢!

sql语句如下:

SELECT *
FROM (SELECT TT.*, ROWNUM AS ROWNO
FROM (Select *
from k_task T
where flight_date between to_date('', 'yyyymmdd') and
to_date('', 'yyyymmdd')
ORDER BY FACT_UP_TIME, flight_no) TT) TABLE_ALIAS
where TABLE_ALIAS.rowno BETWEEN 10 AND 20;

5.另类语法

该语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。此处贴出代码供大家参考之用。

sql语句如下:

With partdata as(
SELECT ROWNUM AS ROWNO, TT.* FROM (Select *
from k_task T
where flight_date between to_date('', 'yyyymmdd') and
to_date('', 'yyyymmdd')
ORDER BY FACT_UP_TIME, flight_no) TT
WHERE ROWNUM <= 20)
Select * from partdata where rowno >= 10;

6. 拼装sql和分页.(有order by)

SELECT r.*
FROM (SELECT
t.*, ROWNUM AS rn
FROM ( SELECT
xm AS name, nl AS age, xb AS gender
FROM test WHERE mx LIKE '%william%' ORDER BY name ) t) r
WHERE r.rn BETWEEN 0 AND 10;

  整理下,就是这样的:(懒得注释,自己猜)

SELECT r.* FROM (SELECT t.*, ROWNUM AS rn FROM (" + innerSql + orderBy + ") t ) r WHERE r.rn <= " + end + " AND r.rn > " + start

7.另类语法 。(无ORDER BY写法)

With partdata as(
Select ROWNUM AS ROWNO, T.*
From K_task T
where Flight_date between to_date('', 'yyyymmdd') and
To_date('', 'yyyymmdd')
AND ROWNUM <= 20)
Select * from partdata where Rowno >= 10;
                                             

最新文章

  1. Excel—TEXT函数功能详解
  2. 打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机
  3. 【转】 strcpy和memcpy的区别
  4. 选择哪种方式进行SharePoint的备份
  5. 内核移植和文件系统制作(3)Ramdisk简介和常见问题
  6. [LintCode] Permuation Index
  7. jQuery组件系列:封装标签页(Tabs)
  8. 优秀而又实用的PHP工具集锦
  9. 夺命雷公狗—angularjs—15—内置封装好的计时器$interval和$timeout
  10. div图片垂直居中 如何使div中图片垂直居中
  11. PAC(Proxy Auto Config)代理自动配置文件的编写
  12. [Hibernate] 基本增删查改
  13. ListView嵌套ListView优化
  14. asp.net基础概念总结
  15. c 对某个整数做因式分解
  16. 【git学习五】git基础之git分支
  17. DATA 步数据纵向串接
  18. Maven将中央仓库修改为阿里云的仓库地址
  19. Maven中央仓库地址整理
  20. python - 远程主机执行命令练习(socket UDP + subprocess.Popen()) 练习1

热门文章

  1. WebForm控件Repeater
  2. 【Oracle】oracle之listagg分析函数
  3. asp.net 数据绑定 -- 时间格式
  4. 访问本地json文件因跨域导致的问题
  5. 使用R语言-RStudio快捷键
  6. C++ 画星号图形——空心矩形(核心代码记录)
  7. 【iCore3双核心板】发布 iCore3 应用开发平台用户手册
  8. Android开发使用TotalControl调试遇到的问题(备注)
  9. ios中蓝牙自动连接出现硬件提示框的问题
  10. linq 小记