分頁查詢中綁定變量

在分頁查詢時,oracle綁定變量的使用優化sql

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);session

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

對應的執行計劃爲:ide

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) " ; 其執行計劃爲:code

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.
相關文章
相關標籤/搜索