绑定变量窥测

环境说明】
oracle版本:11.2.0

【一】进行测试环境的配置
1. 创建表test
 create table test  as select rownum id , a .* from all_objects a ;

2. 创建索引
CREATE INDEX EKPJ." TEST~ID ON EKPJ.TEST (ID) NOLOGGING

3. 进行统计信息的收集
Execute DBMS_STATS . GATHER_TABLE_STATS ( 'SCOTT' , 'TEST' );  

4. 进行字段ID分布情况的收集
SELECT count ( id ), count ( DISTINCT id ), min ( id ), max ( id ) FROM TEST ;
COUNT(ID) COUNT(DISTINCT ID)   MIN(ID)     MAX(ID)
1069299              83539                         1         83539

5. 查看执行计划的SQL
alter session set STATISTICS_LEVEL = ALL   ----不设置无法获得 A - ROWS 等信息;
select * from table ( dbms_xplan . DISPLAY_CURSOR ( null , null , 'ALLSTATS' ));  


【二】进行测试

2.1 测试当id值小于4的时候,这个时候结果集只有4,应该走索引   

点击(此处)折叠或打开

  1. select count(object_name) from test where id <= :id; #此处ID输入4
  2. 2.
  3. 3.SQL_ID 6jq05u5z8k9bn, child number 0
  4. 4.-------------------------------------
  5. 5.select count(object_name) from test where id <= :id
  6. 6.
  7. 7.Plan hash value: 885655847
  8. 8.
  9. 9.------------------------------------------------------------------------------------------------
  10. | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
  11. ------------------------------------------------------------------------------------------------
  12. | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 4 | 1 |
  13. | 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 4 | 1 |
  14. |* 2 | INDEX RANGE SCAN| TEST~ID | 1 | 534K| 512 |00:00:00.01 | 4 | 1 |
  15. ------------------------------------------------------------------------------------------------
  16. 10.
  17. 11.Predicate Information (identified by operation id):
  18. 12.---------------------------------------------------
  19. 13. - access("ID"<=:ID)
  20. 14. 总结:此处使用的是走索引的执行计划,效果很好;


2.2 测试当id值小于83000 的时候,几乎是整个表的数据了,这个时候走全表扫描会更快 

点击(此处)折叠或打开

  1. select count(object_name) from test where id <= :id; #此处ID输入83000
  2. 2.2.SQL_ID 6jq05u5z8k9bn, child number 1
  3. 3.3.-------------------------------------
  4. 4.4.select count(object_name) from test where id <= :id
  5. 5.5.
  6. 6.6.-----------------------------------------------------------------------------------------------------------
  7. 7.| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
  8. 8.-----------------------------------------------------------------------------------------------------------
  9. 9.| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:18.57 | 10M| 172K|
  10. 10.| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:18.57 | 10M| 172K|
  11. 11.| 2 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 534K| 10M|00:00:17.46 | 10M| 172K|
  12. 12.|* 3 | INDEX RANGE SCAN | TEST~ID | 1 | 96237 | 10M|00:00:01.97 | 22664 | 2886 |
  13. 13.-----------------------------------------------------------------------------------------------------------
  14. 14.7.Predicate Information (identified by operation id):
  15. 15.---------------------------------------------------
  16. 16.
  17. 17. 3 - access("ID"<=:ID)
  18. 18.8. 当前显示还是走索引


2.3 测试在ID为83000时候,走全表扫描的速度(通过hint来强制走全表扫描)

点击(此处)折叠或打开

  1. SQL_ID duyq44cmbt2hm, child number 0
  2. -------------------------------------
  3. select /*+FULL(TEST)*/ count(object_type) from test where id <= :id
  4. 2.select count(object_type) from test where id <= 83000 #或直接用数字 Plan hash value: 1950795681
  5. 3.----------------------------------------------------------------------------------------------
  6. | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
  7. ----------------------------------------------------------------------------------------------
  8. | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:02.88 | 158K| 158K|
  9. | 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:02.88 | 158K| 158K|
  10. |* 2 | TABLE ACCESS FULL| TEST | 1 | 534K| 10M|00:00:01.92 | 158K| 158K|
  11. ----------------------------------------------------------------------------------------------
  12.  
  13. Predicate Information (identified by operation id):
  14. ---------------------------------------------------
  15.  
  16.    2 - filter("ID"<=:ID)

显示为2秒88,完成;

总结:
绑定变量产生的执行计划会以第一次的执行计划为标准,当第一次输入一个值的时候,会对这个值进行一个窥探,从而产生一个执行计划;
在OLAP系统并发查询少,但是每次查询大量数据的情况下,可以通过取消绑定变量来提升系统的运行效率;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12679300/viewspace-2127976/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12679300/viewspace-2127976/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Oracle的解释计划是通过使用EXPLAIN PLAN语句来显示优化器为SQL语句选择的执行计划。需要注意的是,解释计划只是预期的执行计划,并不是实际的执行计划和相关的数据源执行统计信息。\[2\]解释计划输出提供了估计的信息,而不是实际的信息。实际的执行计划和统计信息可以通过动态性能视图中的sql_id和sql_child_number字段来查找。这两个字段分别代表SQL语句的解析结果和执行计划序号。可以在v$session和V$sql视图中找到这些字段。如果想查看当前正在执行的SQL的执行计划,可以使用相应的SQL查询这两个字段。\[3\]需要注意的是,由于命令explainplan不能使用绑定变量窥测,所以使用绑定变量时,explainplan生成的执行计划可能不可靠。\[1\] #### 引用[.reference_title] - *1* *3* [Oracle解释计划](https://blog.csdn.net/zhwwanwan/article/details/8624094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [oracle解释&执行计划-Oracle](https://blog.csdn.net/weixin_36012968/article/details/116447006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值