oracle单表分页查询的索引创建

分页模板

select *
  from (select *
          from (select a.*, rownum rn
                  from (查询SQL) a)
         where rownum <= 10)
where rn >= 1;

创建测试表

SYS@ora19c>create table t_page as select * from dba_objects;

Table created.

--注意所有列都是可为空的

SYS@ora19c> desc t_page;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER                                              VARCHAR2(128)
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(128)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(23)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)
 NAMESPACE                                          NUMBER
 EDITION_NAME                                       VARCHAR2(128)
 SHARING                                            VARCHAR2(18)
 EDITIONABLE                                        VARCHAR2(1)
 ORACLE_MAINTAINED                                  VARCHAR2(1)
 APPLICATION                                        VARCHAR2(1)
 DEFAULT_COLLATION                                  VARCHAR2(100)
 DUPLICATED                                         VARCHAR2(1)
 SHARDED                                            VARCHAR2(1)
 CREATED_APPID                                      NUMBER
 CREATED_VSNID                                      NUMBER
 MODIFIED_APPID                                     NUMBER
 MODIFIED_VSNID                                     NUMBER

下面5个例子中,需要将查询结果分页显示,每页显示10条。

例1:select * from t_page order by object_id;

没有过滤条件,只有排序。注意索引(位图索引除外)不保存全是null的记录。

create index IDX_T_PAGE_OBJ_ID on t_page(object_id,0);

select *
  from (select t.*, rownum rn
          from (select * from t_page order by object_id) t
         where rownum <= 10)
where rn > = 1;

----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name              | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                   |      1 |        |       |     3 (100)|          |     10 |00:00:00.01 |       5 |
|*  1 |  VIEW                          |                   |      1 |     10 |  4940 |     3   (0)| 00:00:01 |     10 |00:00:00.01 |       5 |
|*  2 |   COUNT STOPKEY                |                   |      1 |        |       |            |          |     10 |00:00:00.01 |       5 |
|   3 |    VIEW                        |                   |      1 |     10 |  4810 |     3   (0)| 00:00:01 |     10 |00:00:00.01 |       5 |
|   4 |     TABLE ACCESS BY INDEX ROWID| T_PAGE            |      1 |  26010 |  2946K|     3   (0)| 00:00:01 |     10 |00:00:00.01 |       5 |
|   5 |      INDEX FULL SCAN           | IDX_T_PAGE_OBJ_ID |      1 |     10 |       |     2   (0)| 00:00:01 |     10 |00:00:00.01 |       3 |
----------------------------------------------------------------------------------------------------------------------------------------------

例2:select * from t_page where owner = 'SCOTT' order by object_id;

继续用例1创建的索引

select *
  from (select t.*, rownum rn
          from (select /*+ index(t_page IDX_T_PAGE_OBJ_ID)*/* from t_page where owner = 'SCOTT' order by object_id) t
         where rownum <= 10)
where rn > = 1;
----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name              | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                   |      1 |        |       |   550 (100)|          |     10 |00:00:00.01 |     659 |
|*  1 |  VIEW                          |                   |      1 |     10 |  4940 |   550   (1)| 00:00:01 |     10 |00:00:00.01 |     659 |
|*  2 |   COUNT STOPKEY                |                   |      1 |        |       |            |          |     10 |00:00:00.01 |     659 |
|   3 |    VIEW                        |                   |      1 |     10 |  4810 |   550   (1)| 00:00:01 |     10 |00:00:00.01 |     659 |
|*  4 |     TABLE ACCESS BY INDEX ROWID| T_PAGE            |      1 |     10 |  1160 |   550   (1)| 00:00:01 |     10 |00:00:00.01 |     659 |
|   5 |      INDEX FULL SCAN           | IDX_T_PAGE_OBJ_ID |      1 |  26010 |       |    55   (0)| 00:00:01 |  26007 |00:00:00.01 |      66 |
----------------------------------------------------------------------------------------------------------------------------------------------

应该在索引扫描时就得到10条数据,创建owner,object_id字段的联合索引

create index idx_t_page_owner_obj_id on t_page(owner,object_id,0);

select *
  from (select t.*, rownum rn
          from (select /*+ index(t_page idx_t_page_owner_obj_id)*/* from t_page where owner = 'SCOTT' order by object_id) t
         where rownum <= 10)
where rn > = 1;

----------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                    | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
----------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                         |      1 |        |       |     3 (100)|          |     10 |00:00:00.01 |       6 |
|*  1 |  VIEW                          |                         |      1 |     10 |  4940 |     3   (0)| 00:00:01 |     10 |00:00:00.01 |       6 |
|*  2 |   COUNT STOPKEY                |                         |      1 |        |       |            |          |     10 |00:00:00.01 |       6 |
|   3 |    VIEW                        |                         |      1 |     10 |  4810 |     3   (0)| 00:00:01 |     10 |00:00:00.01 |       6 |
|   4 |     TABLE ACCESS BY INDEX ROWID| T_PAGE                  |      1 |     10 |  1160 |     3   (0)| 00:00:01 |     10 |00:00:00.01 |       6 |
|*  5 |      INDEX RANGE SCAN          | IDX_T_PAGE_OWNER_OBJ_ID |      1 |     12 |       |     2   (0)| 00:00:01 |     10 |00:00:00.01 |       3 |
----------------------------------------------------------------------------------------------------------------------------------------------------

例3:select * from t_page order by object_id, object_name desc;

create index idx_t_page_obj_id_name on t_page(object_id, object_name desc,0);

select *
  from (select *
          from (select a.*, rownum rn
                  from (select /*+ index(t_page idx_t_page_obj_id_name)*/*
                          from t_page
                         order by object_id, object_name desc) a)
         where rownum <= 10)
where rn >= 1;

-----------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                   | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
-----------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                        |      1 |        |       |   732 (100)|          |     10 |00:00:00.01 |       5 |
|*  1 |  VIEW                            |                        |      1 |     10 |  4940 |   732   (1)| 00:00:01 |     10 |00:00:00.01 |       5 |
|*  2 |   COUNT STOPKEY                  |                        |      1 |        |       |            |          |     10 |00:00:00.01 |       5 |
|   3 |    VIEW                          |                        |      1 |  26010 |    12M|   732   (1)| 00:00:01 |     10 |00:00:00.01 |       5 |
|   4 |     COUNT                        |                        |      1 |        |       |            |          |     10 |00:00:00.01 |       5 |
|   5 |      VIEW                        |                        |      1 |  26010 |    11M|   732   (1)| 00:00:01 |     10 |00:00:00.01 |       5 |
|   6 |       TABLE ACCESS BY INDEX ROWID| T_PAGE                 |      1 |  26010 |  2946K|   732   (1)| 00:00:01 |     10 |00:00:00.01 |       5 |
|   7 |        INDEX FULL SCAN           | IDX_T_PAGE_OBJ_ID_NAME |      1 |  26010 |       |   139   (0)| 00:00:01 |     10 |00:00:00.01 |       3 |
-----------------------------------------------------------------------------------------------------------------------------------------------------

例4:select * from t_page where owner = 'SYS' and object_id > 1000 order by object_name;

按照索引创建ESR原则,字段顺序为等值(owner = 'SYS'),排序(order by object_name),范围(object_id > 1000)。

create index idx_owner_obj_name_obj_id on t_page(owner,object_name,object_id,0);

select *
  from (select *
          from (select a.*, rownum rn
                  from (select /*+ index(t_page idx_owner_obj_name_obj_id)*/*
                          from t_page
                         where owner = 'SYS'
                           and object_id > 1000
                         order by object_name) a)
         where rownum <= 10)
where rn >= 1;

--------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                      | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                           |      1 |        |       |  7201 (100)|          |     10 |00:00:00.01 |       8 |
|*  1 |  VIEW                            |                           |      1 |     10 |  4940 |  7201   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|*  2 |   COUNT STOPKEY                  |                           |      1 |        |       |            |          |     10 |00:00:00.01 |       8 |
|   3 |    VIEW                          |                           |      1 |  14267 |  6882K|  7201   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|   4 |     COUNT                        |                           |      1 |        |       |            |          |     10 |00:00:00.01 |       8 |
|   5 |      VIEW                        |                           |      1 |  14267 |  6701K|  7201   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|   6 |       TABLE ACCESS BY INDEX ROWID| T_PAGE                    |      1 |  14267 |  1894K|  7201   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|*  7 |        INDEX RANGE SCAN          | IDX_OWNER_OBJ_NAME_OBJ_ID |      1 |  14267 |       |    89   (0)| 00:00:01 |     10 |00:00:00.01 |       3 |
--------------------------------------------------------------------------------------------------------------------------------------------------------

例5:select * from t_page where owner like 'SYS%' and object_id > 1000 order  by object_name;

create index idx_t_page_owner_obj_name_objid on t_page(object_name,owner,object_id,0);

select *
  from (select *
          from (select a.*, rownum rn
                  from (select /*+ index(t_page idx_t_page_owner_obj_name_objid)*/*
                          from t_page
                         where owner like 'SYS%'
                           and object_id > 1000
                         order by object_name) a)
         where rownum <= 10)
where rn >= 1;

--------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                            | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                                 |      1 |        |       |  6817 (100)|          |     10 |00:00:00.01 |       8 |
|*  1 |  VIEW                            |                                 |      1 |     10 |  4940 |  6817   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|*  2 |   COUNT STOPKEY                  |                                 |      1 |        |       |            |          |     10 |00:00:00.01 |       8 |
|   3 |    VIEW                          |                                 |      1 |  14723 |  7102K|  6817   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|   4 |     COUNT                        |                                 |      1 |        |       |            |          |     10 |00:00:00.01 |       8 |
|   5 |      VIEW                        |                                 |      1 |  14723 |  6915K|  6817   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|   6 |       TABLE ACCESS BY INDEX ROWID| T_PAGE                          |      1 |  14723 |  1955K|  6817   (1)| 00:00:01 |     10 |00:00:00.01 |       8 |
|*  7 |        INDEX FULL SCAN           | IDX_T_PAGE_OWNER_OBJ_NAME_OBJID |      1 |  14723 |       |   155   (0)| 00:00:01 |     10 |00:00:00.01 |       3 |
--------------------------------------------------------------------------------------------------------------------------------------------------------------

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一种基于Spring Framework的快速开发Web应用程序的框架,而Oracle是一种强大的关系型数据库。在一些大型项目中,我们需要使用多个表进行分页查询,并将查询结果呈现给用户,这时我们可以结合Spring Boot和Oracle实现多表分页查询。 实现多表分页查询需要引入Spring Boot的分页插件和Oracle的JDBC驱动。在查询数据之前,我们需要定义一个分页信息对象,包含要查询的页数、每页的数据量,以及查询结果的排序信息和过滤条件等。然后,我们可以使用Spring Boot提供的JdbcTemplate或MyBatis框架与Oracle数据库进行数据交互。 为了实现多表分页查询,我们需要在SQL语句中使用Join语句将多个表连接起来,并使用分页插件对查询结果进行分页处理。在处理分页查询时,我们可以采用传统的分页方式,即先查询出所有符合条件的记录总数,然后进行分页查询;也可以采用性能更高的Limit方式,直接指定查询结果的起始位置和数目。 在实现多表分页查询时,我们还需要注意查询效率和查询结果的正确性。通常情况下,我们可以对经常被访问和查询的表进行索引优化,提高查询速度。同时,我们还应该注意使用正确的字段进行Join和分组操作,避免查询结果出现重复数据或遗漏数据的情况。 在使用Spring Boot和Oracle进行多表分页查询时,我们需要掌握相关的知识和技术,才能更好地完成项目开发任务。为此,我们可以参考相关的教程和文档,了解其运行原理和应用场景,提高开发效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值