分页查询中绑定变量

在分页查询时,oracle绑定变量的使用优化

var a number
var b number
var c number
exec :a:=0
exec :b:=10
exec :c:=0
set serveroutput off;
alter session set statistics_level=all;
SELECT * FROM (SELECT T1_.*, rownum ROWNUM_ FROM (
SELECT O.* FROM yyf.testa O
WHERE 1=1
AND O.CREATE_TIME >= to_date(‘20150101 12:00:00‘, ‘yyyymmdd hh24:mi:ss‘)
AND O.CREATE_TIME < to_date(‘20150723 23:59:59‘, ‘yyyymmdd hh24:mi:ss‘)
order by o.CREATE_TIME desc
) T1_ WHERE ROWNUM <= (:a +:b )) WHERE ROWNUM_ >= (:c +1);

select * from table(dbms_xplan.display_cursor(null,null,‘runstats_last‘));

对应的执行计划为:

Plan hash value: 2754511479

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name        | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |             |      1 |        |     10 |00:00:20.07 |     684K|    310K|
|*  1 |  VIEW                    |             |      1 |   4133K|     10 |00:00:20.07 |     684K|    310K|
|*  2 |   COUNT STOPKEY          |             |      1 |        |     10 |00:00:20.07 |     684K|    310K|
|   3 |    VIEW                  |             |      1 |   4133K|     10 |00:00:20.07 |     684K|    310K|
|*  4 |     SORT ORDER BY STOPKEY|             |      1 |   4133K|     10 |00:00:20.07 |     684K|    310K|
|*  5 |      TABLE ACCESS FULL   | testa       |      1 |   4133K|   5351K|00:00:15.40 |     684K|    310K|
-----------------------------------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("ROWNUM_">=:C+1)
   2 - filter(ROWNUM<=:A+:B)
   4 - filter(ROWNUM<=:A+:B)
   5 - filter(("O"."CREATE_TIME">=TIMESTAMP‘ 2015-01-01 12:00:00‘ AND "O"."CREATE_TIME"<TIMESTAMP‘
              2015-07-23 23:59:59‘))

31 rows selected.

从上面执行计划可以看出,虽然在create_time 是not null ,并且有索引,而且该索引的可选择度非常高。但是该sql依然走的全表扫描。

接着对sql进行如下调整,去掉绑定变量的运算,即把条件由"WHERE ROWNUM <= (:a +:b )) WHERE ROWNUM_ >= (:c +1)" 改为 "WHERE ROWNUM <= (:b )) WHERE ROWNUM_ >= (:c) " ; 其执行计划为:

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name                       | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
---------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |                            |      1 |        |     10 |00:00:00.03 |      49 |      4 |
|*  1 |  VIEW                           |                            |      1 |     10 |     10 |00:00:00.03 |      49 |      4 |
|*  2 |   COUNT STOPKEY                 |                            |      1 |        |     10 |00:00:00.03 |      49 |      4 |
|   3 |    VIEW                         |                            |      1 |     12 |     10 |00:00:00.03 |      49 |      4 |
|   4 |     TABLE ACCESS BY INDEX ROWID | testa                      |      1 |   4133K|     10 |00:00:00.03 |      49 |      4 |
|*  5 |      INDEX RANGE SCAN DESCENDING| IDX_testa_CREATETIME       |      1 |     12 |     10 |00:00:00.03 |      36 |      2 |
---------------------------------------------------------------------------------------------------------------------------------

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("ROWNUM_">=:C)
   2 - filter(ROWNUM<=:B)
   5 - access("O"."CREATE_TIME"<TIMESTAMP‘ 2015-07-23 23:59:59‘ AND "O"."CREATE_TIME">=TIMESTAMP‘ 2015-01-01 12:00:00‘)

29 rows selected.
时间: 2024-11-07 07:42:59

分页查询中绑定变量的相关文章

PHP分页查询中的条件查询

下面是分页查询中含有条件的查询的代码.  里面一些代码我已经注明用处. <body> <form method="get"> 关键字:<input type="text" name="name" /> <input type="submit" value="搜索" /> </form> 创建一个表单和按钮进行输入关键字 <table widt

框架学习日志(4):如何通过Ajax进行分页查询并绑定数据?

需求设定 1.在页面中通过Ajax发送请求至程序后端对User表进行分页查询,将数据展示至页面上: 2.要求显示字段:主键.姓名.年龄.出生年份.性别.职位: 3.需要统计总数.可上下翻页.可指定页跳转: User表 Position字段,int型,值范围0-5,依次工作职位:实习生.普通职工.资深职工.团队组长.部门经理.公司经理. 以上为情景设定,接下来进入代码实战. 新建类库,搭建开发流程 User表属于账户管理模块,所以我们将新建的类库取名为Account. 分别在各层建立如下类库.文件

大数据oracle分页查询

ROWNUM 可能都知道ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1,不能进行大于的比较. ROWNUM是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推. ROWNUM总是从1开始,不管当前的记录是否满足查询结果,ROWNUM返回的值都是1,如果这条记录的值最终满足所有的条件,那么ROWNUM会递加,下一条记录的ROWNUM会返回2,否则下一条记录的ROWNUM仍然返回1. 理解了这一点,就清楚为什么一般的ROWNUM大于某个

Oracle ROWNUM用法和分页查询总结

********************************************************************************************************** [转载] Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/100278 Oracle分页查询格式(二):http://yangtingkun.itpub.ne

JDBC在Java Web中的应用——分页查询

分页查询 通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,在这里介绍两种非常典型的分页方法. 通过ResultSet的光标实现分页 通过ResultSet的光标实现分页,优点是在各种数据库上通用,缺点是占用大量资源,不适合数据量大的情况. 2. 通过数据库机制进行分页 很多数据库自身都提供了分页机制,如SQL Server中提供的top关键字,MySQL数据库中提供的limit关键字,它们都可以设置数据返回的记录数. 通过各种数据库的分页机制实现分页查询,其优

Oracle 10g中一个关于绑定变量和非绑定变量的测试对比

首先创建测试表并记录解析统计数据: 进行循环插入数据,以下代码并未使用绑定变量: 发现在增加了11个硬解析. 查询v$sqlarea视图,可以找到这些不能共享的SQL,注意每条SQL都只执行了一次,这些SQL不仅解析要消耗密集的SQL资源,也要占用共享内存存储这些不同的SQL代码: 重建测试表,进行第二次测试: 这一次使用绑定变量,同样10次数据插入: 现在看一下SQL解析的统计数据库,硬解析由原来的145增加到147. 对于该SQL,共享池中只存在一份,解析一次,执行10次,这就是绑定变量的优

获取绑定变量语句中传入的值

查看绑定变量的值 --还有一种方式 --首先查询出这条SQL 语句的 HASH_VALUE select A.SQL_ID,A.HASH_VALUE,A.CHILD_NUMBER,A.SQL_TEXT from v$sql a where A.SQL_TEXT like 'SELECT T_LTE_CARD_INFO.PK,%' 2621316314    0  SELECT T_LTE_CARD_INFO.PK,%..... --传入HASH_VALUE的值 select * from tab

mybatis中分页查询

1 如果在查询方法中有多个参数,可以使用map对象将所有数据都存储进去.比如分页查询,需要用到两个参数,可以将这两个参数包装到map中. 例子:分页查询 dao层方法 public List<Student> getStudentPage(int pstart, int pnumber) throws Exception{ SqlSession sqlSession = MybatisUtil.getSqlSession(); Map<String,Integer> map = n

Oracle中分页查询语句

Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE