0

0

Oracle 10g SQL分页查询语句和效率分析

php中文网

php中文网

发布时间:2016-06-07 16:48:49

|

1106人浏览过

|

来源于php中文网

原创

在使用Oracle数据库进行分页查询算法设计时,分页查询的SQL语句基本上可以按照下面给出的模板来进行套用:

在使用oracle数据库进行分页查询算法设计时,分页查询的sql语句基本上可以按照下面给出的模板来进行套用:
 
分页查询格式:
 select * from
(
 select a.*, rownum rn
from (select * from table_name) a
where rownum  )
 where rn >= 11

其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM = 11控制分页查询的每页的范围。
 上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM  选择第11到20条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM  SELECT * FROM
(
 SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
 WHERE RN BETWEEN 11 AND 20
 
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
 
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件
 
WHERE ROWNUM  
而第二个查询语句,由于查询条件BETWEEN 11 AND 20是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
 
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
 

Linux-6-64下安装Oracle 12C笔记

在CentOS 6.4下安装Oracle 11gR2(x64)

Oracle 11gR2 在VMWare虚拟机中安装步骤

Debian 下 安装 Oracle 11g XE R2

豆包MarsCode
豆包MarsCode

豆包旗下AI编程助手,支持DeepSeek最新模型

下载

下面简单讨论一下多表联合的情况。对于最常见的等值表连接查询,
 
CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页
 
,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。
 因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:
 
SELECT /*+ FIRST_ROWS */ * FROM
(
 SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM  )
 WHERE RN >= 11
 

 

下面用几个例子来说明分页查询的效率。首先选择一个比较大的表作为测试表:
 可以采用Oracle 10g R2数据库自带的示例方案中的OE用户的数据表 customers表做测试:
 
下面是CUSTOMERS表的DDL定义语句,主要是为了让大家理解表结构
 CREATE TABLE "SH"."CUSTOMERS"
  ( "CUST_ID" NUMBER NOT NULL ENABLE,
 "CUST_FIRST_NAME" VARCHAR2(20) NOT NULL ENABLE,
 "CUST_LAST_NAME" VARCHAR2(40) NOT NULL ENABLE,
 "CUST_GENDER" CHAR(1) NOT NULL ENABLE,
 "CUST_YEAR_OF_BIRTH" NUMBER(4,0) NOT NULL ENABLE,
 "CUST_MARITAL_STATUS" VARCHAR2(20),
 "CUST_STREET_ADDRESS" VARCHAR2(40) NOT NULL ENABLE,
 "CUST_POSTAL_CODE" VARCHAR2(10) NOT NULL ENABLE,
 "CUST_CITY" VARCHAR2(30) NOT NULL ENABLE,
 "CUST_CITY_ID" NUMBER NOT NULL ENABLE,
 "CUST_STATE_PROVINCE" VARCHAR2(40) NOT NULL ENABLE,
 "CUST_STATE_PROVINCE_ID" NUMBER NOT NULL ENABLE,
 "COUNTRY_ID" NUMBER NOT NULL ENABLE,
 "CUST_MAIN_PHONE_NUMBER" VARCHAR2(25) NOT NULL ENABLE,
 "CUST_INCOME_LEVEL" VARCHAR2(30),
 "CUST_CREDIT_LIMIT" NUMBER,
 "CUST_EMAIL" VARCHAR2(30),
 "CUST_TOTAL" VARCHAR2(14) NOT NULL ENABLE,
 "CUST_TOTAL_ID" NUMBER NOT NULL ENABLE,
 "CUST_SRC_ID" NUMBER,
 "CUST_EFF_FROM" DATE,
 "CUST_EFF_TO" DATE,
 "CUST_VALID" VARCHAR2(1),
  CONSTRAINT "CUSTOMERS_PK" PRIMARY KEY ("CUST_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "EXAMPLE"  ENABLE NOVALIDATE,
  CONSTRAINT "CUSTOMERS_COUNTRY_FK" FOREIGN KEY ("COUNTRY_ID")
    REFERENCES "SH"."COUNTRIES" ("COUNTRY_ID") ENABLE NOVALIDATE
    ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS NOLOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "EXAMPLE" ;
 
  CREATE BITMAP INDEX "SH"."CUSTOMERS_GENDER_BIX" ON "SH"."CUSTOMERS" ("CUST_GENDER")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "EXAMPLE" ;
 
  CREATE BITMAP INDEX "SH"."CUSTOMERS_MARITAL_BIX" ON "SH"."CUSTOMERS" ("CUST_MARITAL_STATUS")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "EXAMPLE" ;
 
  CREATE UNIQUE INDEX "SH"."CUSTOMERS_PK" ON "SH"."CUSTOMERS" ("CUST_ID")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "EXAMPLE" ;
 
  CREATE BITMAP INDEX "SH"."CUSTOMERS_YOB_BIX" ON "SH"."CUSTOMERS" ("CUST_YEAR_OF_BIRTH")
  PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "EXAMPLE" ;
 
  ALTER TABLE "SH"."CUSTOMERS" ADD CONSTRAINT "CUSTOMERS_PK" PRIMARY KEY ("CUST_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "EXAMPLE"  ENABLE NOVALIDATE;
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_ID" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_FIRST_NAME" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_LAST_NAME" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_GENDER" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_YEAR_OF_BIRTH" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_STREET_ADDRESS" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_POSTAL_CODE" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_CITY" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_CITY_ID" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_STATE_PROVINCE" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_STATE_PROVINCE_ID" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("COUNTRY_ID" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_MAIN_PHONE_NUMBER" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_TOTAL" NOT NULL ENABLE);
 
  ALTER TABLE "SH"."CUSTOMERS" MODIFY ("CUST_TOTAL_ID" NOT NULL ENABLE);
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_ID" IS 'primary key';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_FIRST_NAME" IS 'first name of the customer';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_LAST_NAME" IS 'last name of the customer';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_GENDER" IS 'gender; low cardinality attribute';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_YEAR_OF_BIRTH" IS 'customer year of birth';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_MARITAL_STATUS" IS 'customer marital status; low cardinality attribute';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_STREET_ADDRESS" IS 'customer street address';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_POSTAL_CODE" IS 'postal code of the customer';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_CITY" IS 'city where the customer lives';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_STATE_PROVINCE" IS 'customer geography: state or province';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."COUNTRY_ID" IS 'foreign key to the countries table (snowflake)';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_MAIN_PHONE_NUMBER" IS 'customer main phone number';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_INCOME_LEVEL" IS 'customer income level';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_CREDIT_LIMIT" IS 'customer credit limit';
 
    COMMENT ON COLUMN "SH"."CUSTOMERS"."CUST_EMAIL" IS 'customer email id';
 
    COMMENT ON TABLE "SH"."CUSTOMERS"  IS 'dimension table';
 
    GRANT SELECT ON "SH"."CUSTOMERS" TO "BI";

更多详情见请继续阅读下一页的精彩内容:

linux

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

32

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

23

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

16

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

268

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

195

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

170

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

85

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
php初学者入门课程
php初学者入门课程

共10课时 | 0.6万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2万人学习

WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号