博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分页查询中绑定变量
阅读量:4684 次
发布时间:2019-06-09

本文共 5071 字,大约阅读时间需要 16 分钟。

在分页查询时,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: 2754511479PLAN_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"

从上面执行计划可以看出,虽然在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-01-01 12:00:00')29 rows selected.

 

posted on
2015-07-27 17:36  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/yiyuf/p/4680758.html

你可能感兴趣的文章
vim代码格式化插件clang-format
查看>>
RTP Payload Format for Transport of MPEG-4 Elementary Streams over http
查看>>
Java环境变量设置
查看>>
【JBPM4】判断节点decision 方法3 handler
查看>>
filter 过滤器(监听)
查看>>
c语言基础知识要点
查看>>
node启动时, listen EADDRINUSE 报错;
查看>>
杭电3466————DP之01背包(对状态转移方程的更新理解)
查看>>
kafka中的消费组
查看>>
python--注释
查看>>
前端资源链接 ...
查看>>
yum install ntp 报错:Error: Package: ntp-4.2.6p5-25.el7.centos.2.x86_64 (base)
查看>>
leetcode-Single Number-136
查看>>
CF715C Digit Tree
查看>>
二分法练习1
查看>>
QT 制作串口调试小助手----(小白篇)
查看>>
前端MVC实践之hellorocket——by张舒彤
查看>>
OptimalSolution(2)--二叉树问题(3)Path路径问题
查看>>
IPC 之 Messenger 的使用
查看>>
macos 下usb键盘问题.
查看>>