`

临时表执行计划-动态采样

阅读更多

--exec dbms_stats.gather_table_STATS('SA',upper('temp_T_ORG_Admin'),cascade => true); --执行后数据量4

--1)

select org.fid,REA.FPERSONID 

from temp_T_ORG_Admin org,T_HR_EMPORGRELATION rea

 where ORG.FID=REA.FADMINORGID;

 

 --刚开始数据量temp_T_ORG_Admin 88 ,执行计划,temp_T_ORG_Admin 88、 T_HR_EMPORGRELATION index fast full scan扫描;

 --删除后数据量temp_T_ORG_Admin 4 ,执行计划 ,temp_T_ORG_Admin 88,T_HR_EMPORGRELATION index range scan扫描;

 --说明:表真实数据量变化了,统计信息没有立即改变

 

 --!!!***@@@注意:对全局临时表(即session 临时表),执行做数据量统计,是很危险的; 例如sys登录做dbms_stats.gather_table_STATS('SA',upper('temp_T_ORG_Admin'),cascade => true); 得到统计信息,这个统计信息会作用/影响所有session访问sa.temp_T_ORG_Admin的执行计划。

 --可以使用hint显式让临时表使用动态采样

 select  /*+ dynamic_sampling(temp_T_ORG_Admin 5)*/ * from temp_T_ORG_Admin;

 select  /*+ dynamic_sampling(TEMP_T_ORG_ADMIN 5)*/ count(*)

from temp_T_ORG_Admin org,T_HR_EMPORGRELATION rea

 where ORG.FID=REA.FADMINORGID; 

 -- 或者删除统计信息 (如果发现执行计划走错,删除表的统计信息,让其动态采样).  临时表可以,删除统计信息,让后锁住统计信息。

 --(如果临时表数据很大,还是可以建立索引,以及收集统计信息的)

exec dbms_stats.delete_table_stats(ownname => 'SA',tabname => upper('temp_T_ORG_Admin'),cascade_indexes => true) ;

exec dbms_stats.lock_table_stats(ownname => 'SA',tabname => upper('temp_T_ORG_Admin'),stattype => 'ALL');

 --2)

     select org.fid,REA.FPERSONID 

from middle_T_ORG_Admin org,T_HR_EMPORGRELATION rea

 where ORG.FID=REA.FADMINORGID;

 --middle_T_ORG_Admin普通表

 --刚开始数据量middle_T_ORG_Admin 88 ,执行计划,temp_T_ORG_Admin 88、 T_HR_EMPORGRELATION index fast full scan扫描;

 --删除后数据量middle_T_ORG_Admin 4 ,执行计划 ,temp_T_ORG_Admin 88,T_HR_EMPORGRELATION  index range scan扫描;

 --说明:经过上述操作,没有执行dbms_stats.gather_table_STATS('SA',upper('temp_T_ORG_Admin'),cascade => true);,***统计信息始终没有***!

 

  --!!!说明:经过1、2说明表的数据量真实变了,但是不会立即改变统计信息user_TAB_STATISTICS; Oracle对没有分析的段做动态采样。

  -- 导致执行计划选择T_HR_EMPORGRELATION的访问方式不同,是因为对关联表动态采样导致的。

  /*

  在Oracle 10g中默认对***(从来)没有分析(过)的段***做动态采样

          动态采样(Dynamic Sampling)技术的最初提出是在Oracle 9i R2,在段(表,索引,分区)没有分析的情况下,

  为了使CBO 优化器得到足够的信息以保证做出正确的执行计划而发明的一种技术,可以把它看做分析手段的一种补充。

         当段对象没有统计信息时(即没有做分析),动态采样技术可以通过直接从需要分析的对象上收集数据块(采样)

   来获得CBO需要的统计信息。

 

  SQL> select * from sa.temp_T_ORG_Admin;

  未选定行

  执行计划

  ----------------------------------------------------------

  Plan hash value: 2283835278

 

  --------------------------------------------------------------------------------------

  | Id  | Operation         | Name             | Rows  | Bytes | Cost (%CPU)| Time     |

  --------------------------------------------------------------------------------------

  |   0 | SELECT STATEMENT  |                  |     1 |  5558 |     2   (0)| 00:00:01 |

  |   1 |  TABLE ACCESS FULL| TEMP_T_ORG_ADMIN |     1 |  5558 |     2   (0)| 00:00:01 |

  --------------------------------------------------------------------------------------

  Note

  -----

     - dynamic sampling used for this statement (level=2)

 

 

   SQL> select * from sa.middle_T_ORG_Admin;

  执行计划

  ----------------------------------------------------------

  Plan hash value: 2591856227

 

  ----------------------------------------------------------------------------------------

  | Id  | Operation         | Name               | Rows  | Bytes | Cost (%CPU)| Time     |

  ----------------------------------------------------------------------------------------

  |   0 | SELECT STATEMENT  |                    |     4 | 22232 |     3   (0)| 00:00:01 |

  |   1 |  TABLE ACCESS FULL| MIDDLE_T_ORG_ADMIN |     4 | 22232 |     3   (0)| 00:00:01 |

  ----------------------------------------------------------------------------------------

 

  Note

  -----

     - dynamic sampling used for this statement (level=2) --默认动态采样的级别为2

  */

  

  --3)

  --在另外的session,sqlplus sys执行dbms_stats.gather_table_STATS('SA',upper('temp_T_ORG_Admin'),cascade => true);后,执行计划,数据量temp_T_ORG_Admin 1,T_HR_EMPORGRELATION index range scan

  --在本session执行dbms_stats.gather_table_STATS('SA',upper('temp_T_ORG_Admin'),cascade => true);后,执行计划,数据量temp_T_ORG_Admin 4,T_HR_EMPORGRELATION index range scan

  --!!!###提醒注意:如果执行数据量改变的操作后,执行了统计分析存储过程,这时就会使用统计信息来生成执行计划;  如果再次,执行数据量变化的操作 却 没有再执行统计信息分析,这个时候的执行计划使用的是上次的统计信息,会导致不准确。

  

  /*

  作用:

  (1)       CBO 依赖的是充分的统计分析信息,但是并不是每个用户都会非常认真,及时地去对每个表做分析。 

  为了保证执行计划都尽可能地正确,Oracle 需要使用动态采样技术来帮助CBO 获取尽可能多的信息。

  (2)       全局临时表。 通常来讲,临时表的数据是不做分析的,因为它存放的数据是临时性的,可能很快就释放了,

但是当一个查询关联到这样的临时表时,CBO要想获得临时表上的统计信息分析数据,就只能依赖于动态采样了。

  缺点:

  (1)       采样的数据块有限,对于海量数据的表,结果难免有偏差。

  (2)       采样会消耗系统资源,特别是OLTP数据库,尤其不推荐使用动态采样。

  动态采样也需要额外的消耗数据库资源,所以,如果 SQL 被反复执行,变量被绑定,硬分析很少,在这样一个环境中,

  是不宜使用动态采样的,就像OLTP系统。 ***动态采样发生在硬分析时,如果很少有硬分析发生,动态采样的意义就不大***。

  */

  

  --在11G,ORACLE新推出了包DBMS_SQLDIAG,使用该包中的DUMP_TRACE过程,可以获取正在运行的SQL的执行计划的生成过程

分享到:
评论

相关推荐

    深入理解Oracle动态采样.pdf

    在这种情况下,通过删除临时表的统计信息并锁定,使得查询时优化器能够对临时表进行动态采样,从而获得更准确的基数估算,避免执行计划的偏差。 其次,当在单表上使用复杂的过滤条件,尤其是非相等操作或涉及转换...

    Oracle动态采样.pdf

    Oracle动态采样是Oracle数据库中一种优化技术,用于解决在复杂查询中由于统计信息不准确导致的执行计划问题。动态采样允许数据库在编译SQL语句时对表进行小规模的数据采样,以获取更准确的行数(cardinality)估计,...

    Oracle动态采样.zip

    Oracle动态采样是数据库优化器(optimizer)在执行SQL查询时使用的一种技术,它旨在减少全表扫描或索引全扫描的成本,同时提供足够准确的行数估计,以生成高效的执行计划。动态采样允许Oracle在执行查询前对数据进行...

    PeopleSoft Enterprise Performance on Oracle 10G

    4. **运行时临时表统计信息**:对于临时表,运行时统计信息可以通过设置初始化参数`STATISTICS_LEVEL`来启用,这有助于优化临时表的查询执行计划。 5. **禁用%UpdateStats**:默认情况下,PeopleSoft可能使用`%...

    Oracle9i优化器介绍

    执行计划包括了数据访问的方法(如索引扫描或全表扫描)、连接顺序、排序和临时表的使用等。 4. 动态采样: 为更准确地估算成本,Oracle9i引入了动态采样。在某些情况下,优化器会随机抽取部分数据进行统计,以便...

    Oracle SQL Tuning Pocket Reference

    - **动态采样问题**:动态采样是一种收集额外统计信息的方法,但它可能会引入额外开销或导致不稳定的执行计划。 **解决方案**: - 定期更新统计信息。 - 调整动态采样的级别以获得更好的性能。 - 使用`DBMS_STATS`...

    proteus元件库英文对照表-(整理清晰).pdf

    ### Proteus元件库中英对照表解析 #### 模拟电子元器件 AnalogIcs - **Amplifier**: 放大器,用于增加输入信号的幅度或功率。 - **Comparators**: 比较器,一种特殊的运算放大器,用于比较两个电压值,并输出相应...

    oracle官方教材

    - 避免不必要的排序和临时表使用。 **编写可共享游标的SQL** - 使用绑定变量。 - 避免使用动态SQL。 **性能核对清单** - 审查SQL语句。 - 检查索引使用情况。 - 监控性能指标。 #### 三、优化程序简介 **课程...

    (E文)基于成本的Oracle优化法则.pdf

    - **6.7.1 动态采样**:介绍动态采样在处理相互关联列时的作用。 - **6.7.2 优化器配置文件**:探讨优化器配置文件如何影响相互关联列的选择率。 - **6.8 传递闭包**:讨论传递闭包的概念及其在选择率估计中的应用...

    hive调优总结文档-hive tuning ppt

    - **子查询优化**:避免嵌套子查询,尝试重写为更高效的JOIN或临时表。 4. **执行引擎优化**: - **Tez与Spark**:考虑使用Tez或Spark作为执行引擎,它们提供了更高效的执行模型,比默认的MapReduce更快。 - **...

    最新烟气自动采样器及测定仪行业安全生产设备设施及隐患排查治理.docx

    - 设备年度综合维修(大修)计划安排表和完成登记表:记录了设备的年度维修计划及其执行情况,便于跟踪设备状态。 - 设备维修保养记录:保存每次维修保养的具体信息,便于分析设备性能和故障模式。 - 设备设施管理...

    收获,不止SQL优化--抓住SQL的本质

    7.3.2 全局临时表案例 190 7.3.3 监控异常的表设计 195 7.3.4 表设计优化相关案例总结 199 7.4 本章习题、总结与延伸 199 第8章 且慢,学习索引如何让SQL飞 200 8.1 索引知识要点概述 201 8.1.1 索引结构的...

    Hive语法详解.docx (排版清晰,覆盖全面,含目录)

    - **创建临时表**:仅在当前会话中可见。 **2.2 修改表结构** - **表操作**:包括重命名表名、添加或删除表等。 - **列操作**:增加、修改或删除列。 - **分区操作**:增加或删除分区。 **2.3 视图操作** - **...

    实战Oracle 12c AWR.pdf

    - **存储位置**:采样数据存储在`SYSAUX`表空间中。 - **表命名规则**:元数据信息存储在以`WRM$_*`开头的表中,实际统计数据存储在以`WRH$_*`开头的表中。 - **表空间满处理**:当`SYSAUX`表空间满时,AWR将自动...

    最新烟尘、粉尘自动采样器及测定仪行业安全生产设备设施及隐患排查治理.docx

    - 设备年度综合维修(大修)计划安排表与完成登记表:规划并记录年度大修工作,确保设备得到及时维护。 - 设备维修保养记录:详实记录每次保养和维修的情况,为设备健康管理提供数据支持。 - 设备设施管理台账:...

    SQL Server统计信息:问题和解决方案.docx

    SQL Server的统计信息是数据库引擎的关键组成部分,它们对查询优化器估算执行计划的成本和选择最佳执行路径至关重要。统计信息提供关于表中数据分布的信息,帮助确定何时使用特定索引。以下是一些关于SQL Server统计...

    最新SO2自动采样器及测定仪行业安全生产设备设施及隐患排查治理.docx

    - **设备年度综合维修(大修)计划安排表**和**完成登记表**:详细记录了年度维修计划及其实施情况,便于追踪设备维护的状态。 - **设备维修保养记录**:记录每次维修保养的具体内容,作为设备历史状态的重要依据...

    QM收货质检计划流程.doc

    物料依照任务清单执行检验自动分配—设置此标识则系统拟定自动分配任务清单检查特性—假如基于特性记录结果,则必须通过任务清单来执行采样过程—物料在不同的检验类型中假如分配了采样过程则会依照采样过程主数据中...

    oracle 12c new feature

    Oracle 12c引入了新的SQL执行引擎优化机制,包括动态采样(Dynamic Sampling)、自适应执行计划(Adaptive Execution Plans)和并行查询(Parallel Query)等。这些优化措施共同提高了查询的响应时间和整体系统性能。 ###...

    ORACLE-AWR报告结果分析.pdf

    - **I/O**:涉及磁盘数据读取和临时表空间使用,物理I/O过多可能导致性能下降。 6. **优化策略**: - 优化SQL语句,减少复杂度和资源消耗。 - 调整内存参数,确保合适的数据驻留在内存中。 - 分析等待事件,...

Global site tag (gtag.js) - Google Analytics