[20120915]10046事件与执行计划改变.txt

简介:     使用10046事件来跟踪解决oracle的许多问题,是非常常用的手段,但是实际上可能出现跟踪的sql执行计划与原来不同的情况,自己应该引起注意.测试如下:1.


    使用10046事件来跟踪解决oracle的许多问题,是非常常用的手段,但是实际上可能出现跟踪的sql执行计划与原来不同的情况,自己应该引起注意.
测试如下:

1.测试环境建立:

SQL> select * from v$version ;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> create table t as select rownum id , 'test' name from dual connect by level
Table created.

SQL> insert into t select 1e4+1 ,'book' from dual connect by level
10000 rows created.

SQL> create index i_t_id on t(id);
Index created.

--可以发现id分布不均匀,而且10001占了50%.建立直方图看看.

SQL> exec dbms_stats.gather_table_stats(ownname=>user,tabname=>'T',cascade=>true,method_opt=>'for all columns size 254');
PL/SQL procedure successfully completed.

2.开始测试:

SQL> variable v_id number ;
SQL> exec :v_id := 42;

PL/SQL procedure successfully completed.

SQL> select * from t where id=:v_id;

        ID NAME
---------- ----
        42 test

SQL> @dpc ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  d9msgvzah6u4p, child number 0
-------------------------------------
select * from t where id=:v_id

Plan hash value: 4153437776

--------------------------------------------------------------------
| Id  | Operation                   | Name   | E-Rows | Cost (%CPU)|
--------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |        |     2 (100)|
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |      1 |     2   (0)|
|*  2 |   INDEX RANGE SCAN          | I_T_ID |      1 |     1   (0)|
--------------------------------------------------------------------
Peeked Binds (identified by position):
--------------------------------------
   1 - (NUMBER): 42
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ID"=:V_ID)
Note
-----
   - Warning: basic plan statistics not available. These are only collected when:
       * hint 'gather_plan_statistics' is used for the statement or
       * parameter 'statistics_level' is set to 'ALL', at session or system level
30 rows selected.

将select * from t where id=:v_id;执行多次,避免ACS的影响.(我使用的是11G).

SQL> select sql_text,sql_id,child_number,executions from v$sql where sql_id='d9msgvzah6u4p';

SQL_TEXT                                 SQL_ID        CHILD_NUMBER EXECUTIONS
---------------------------------------- ------------- ------------ ----------
select * from t where id=:v_id           d9msgvzah6u4p            0          9

3.打开10046跟踪看看:
SQL> exec :v_id := 10001;
PL/SQL procedure successfully completed.

SQL> alter session set events '10046 trace name context forever, level 12';
Session altered.

SQL> select * from t where id=:v_id;
...

SQL> alter session set events '10046 trace name context off';

SQL> select sql_text,sql_id,child_number,executions from v$sql where sql_id='d9msgvzah6u4p';

SQL_TEXT                                 SQL_ID        CHILD_NUMBER EXECUTIONS
---------------------------------------- ------------- ------------ ----------
select * from t where id=:v_id           d9msgvzah6u4p            0          9
select * from t where id=:v_id           d9msgvzah6u4p            1          1

--查看视图V$SQL,发现生成了新的子光标.

SQL> select * from table(dbms_xplan.display_cursor('d9msgvzah6u4p',1,'ALLSTATS LAST PEEKED_BINDS cost'));

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------
SQL_ID  d9msgvzah6u4p, child number 1
-------------------------------------
select * from t where id=:v_id

Plan hash value: 1601196873

-------------------------------------------------------------------------------------------------
| Id  | Operation         | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |      1 |        |    14 (100)|  10000 |00:00:00.01 |      96 |
|*  1 |  TABLE ACCESS FULL| T    |      1 |  10039 |    14   (0)|  10000 |00:00:00.01 |      96 |
-------------------------------------------------------------------------------------------------
Peeked Binds (identified by position):
--------------------------------------
   1 - (NUMBER): 10001
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("ID"=:V_ID)
23 rows selected.

--查看跟踪文件也可以发现,执行计划发生了变化:
SQL ID: d9msgvzah6u4p
Plan Hash: 1601196873
select *
from
 t where id=:v_id

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       51      0.00       0.00          0         96          0       10000
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       53      0.00       0.01          0         96          0       10000

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows     Row Source Operation
-------  ---------------------------------------------------
  10000  TABLE ACCESS FULL T (cr=96 pr=0 pw=0 time=11152 us cost=14 size=90351 card=10039)

4.看看什么导致的光标不能共享:
SQL> @share d9msgvzah6u4p
SQL_TEXT                       = select * from t where id=:v_id
SQL_ID                         = d9msgvzah6u4p
ADDRESS                        = 00000000DE2DC258
CHILD_ADDRESS                  = 00000000DE2DBE58
CHILD_NUMBER                   = 0
--------------------------------------------------
SQL_TEXT                       = select * from t where id=:v_id
SQL_ID                         = d9msgvzah6u4p
ADDRESS                        = 00000000DE2DC258
CHILD_ADDRESS                  = 00000000DE29D1B8
CHILD_NUMBER                   = 1
STATS_ROW_MISMATCH             = Y
--------------------------------------------------

PL/SQL procedure successfully completed.

--可以发现实际上STATS_ROW_MISMATCH=Y.

    也就是将在开启跟踪后,会话执行的SQL将不会重用以前的的执行计划,发生硬解析。由于硬解析时要发生绑定变量窥视,将会使硬解析产生的子游标,而这里由于
ID数据的分布变化,导致其执行计划可能发生了变化。

5.实际上这种情况很多:
比如设置optimizer_capture_sql_plan_baselines=true也会出现类似情况.
设置sql_trace =true等.

目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 监控
智能的三重境界:从感知、认知到决策的进化
智能的三重境界:从感知、认知到决策的进化
569 121
|
2月前
|
存储 弹性计算 固态存储
阿里云服务器按量、包月及包年收费价格,云服务器最新活动价格参考
2025年租用阿里云服务器一年多少钱?不同时期阿里云服务器的租用价格不同,2核2G200M轻量应用云服务器特价38元1年起,经济型e实例2核2G3M带宽 40G ESSD Entry云盘特惠价99元1年,通用算力型u1实例2核4G5M带宽80G ESSD Entry云盘特惠价199元1年。2025年阿里云服务器租用价格表如下文所示。
950 2
阿里云服务器按量、包月及包年收费价格,云服务器最新活动价格参考
|
2月前
|
传感器 人工智能 供应链
智能体未来发展趋势:对标国家“十四五”AI规划的技术方向研判
《智能体技术发展白皮书(2024)》指出,自主、多模态、行业化智能体将成为未来三年核心方向。自主智能体实现动态决策,提升制造效率;多模态智能体优化人机交互,覆盖智能家居等场景;行业化智能体深度融合医疗、金融、教育等领域,推动数字化转型。预计2027年行业市场规模超800亿元,助力国家人工智能战略落地。(238字)
|
2月前
|
机器学习/深度学习 缓存 自然语言处理
30_情感分析变体详解:从极性到细粒度 - 深度解析与教学
情感分析(Sentiment Analysis),又称意见挖掘(Opinion Mining),是自然语言处理(NLP)领域的核心任务之一,旨在自动识别和提取文本中的情感信息。随着社交媒体的普及和用户生成内容的爆炸式增长,情感分析技术在商业决策、舆情监测、产品开发等领域发挥着越来越重要的作用。
|
2月前
|
存储 供应链 API
1688获得店铺所有商品的API接口
本文介绍如何通过1688开放平台API获取指定店铺的全部商品信息,涵盖注册、认证、分页调用及Python代码实现,适用于数据同步、库存管理与电商分析,内容真实可靠,步骤清晰易行。
331 0
|
3月前
|
传感器 人工智能 安全
物联网
万物互联,智启未来。物联网通过连接人、物、环境,重塑生活、城市与产业。从智能家居到智慧城市,从工业互联网到精准农业,数据驱动智能化变革。融合AI、5G等技术,构建高效、安全、可持续的智能世界,开启人类社会新篇章。(238字)
|
4月前
|
C++
什么是单项式
单项式是代数式中的一种
|
8月前
|
存储 监控 文件存储
《告别磁盘空间焦虑!LVM的灵活分配与扩展秘籍》
逻辑卷管理(LVM)是磁盘空间管理的强大工具,突破了传统分区固定大小的限制。它通过物理卷(PV)、卷组(VG)和逻辑卷(LV)三层结构,实现存储空间的灵活分配与动态扩展。LVM适用于企业服务器、虚拟化环境及大数据集群等场景,能高效应对不断变化的存储需求。使用时需注意数据备份、合理规划与状态监控,确保系统稳定运行。掌握LVM原理与操作,可显著提升磁盘空间管理效率。
257 26
|
11月前
|
Python
灵码回复消息的字体太小,并在pycharm中没法设置.Baidu Comate就可以直接插件中设置了
在使用灵码回复消息时,字体过小且在PyCharm中无法调整。而Baidu Comate插件则可以在插件设置中直接修改字体大小,提供更好的阅读体验。
693 78
|
9月前
|
机器学习/深度学习 人工智能 DataWorks
《数据驱动新变革:DataWorks与图神经网络打造AI决策“最强大脑”》
在数字化时代,数据成为企业的核心资产。DataWorks作为大数据管理的中流砥柱,负责存储、整合和治理海量数据;图神经网络(GNN)则为处理复杂图结构数据提供创新方案。两者结合,开启了知识图谱数据处理与分析的新纪元,助力人工智能推理与决策。DataWorks构建庞大的数据生态体系,涵盖结构化、半结构化及非结构化数据。知识图谱如同智能导航灯塔,将分散的数据编织成紧密的知识网络。以互联网广告行业为例,DataWorks收集用户浏览、广告投放等数据,通过知识图谱关联,揭示用户与广告主、创意间的复杂关系。
216 5