日期:2014-05-16  浏览次数:20353 次

Oracle 中的动态采样(dynamic sampling)相关示例

动态采样(Oracle Dynamic sampling)


1.1首先回顾下动态采样(dynamic sampling)的相关知识点

这个特性,使数据库随机的扫描表中少量的block,用来增强数据库的统计信息。

1.1.1 目的

动态采样增加了那些丢失的或者不足的优化器统计信息。使用动态采样可以让优化器更好的选择谓词。动态采样能够补充类似表中block个数,相关的索引block个数,表的集势(ronded个数),相关的连接列的统计信息(提供extendedstatistics的功能)。

1.1.2 动态采样概念

动态采样默认为启动状态,可以设置 OPTIMIZER_DYNAMIC_SAMPLING=0来禁用掉这一特性。

OPTIMIZER_DYNAMIC_SAMPLING也是和动态采样最重要的参数,它控制着动态采样级别。

1.1.3 OPTIMIZER_DYNAMIC_SAMPLING动态参数说明

OPTIMIZER_DYNAMIC_SAMPLING

Property

Description

Parameter type

Integer

Default value

If OPTIMIZER_FEATURES_ENABLE is set to 10.0.0 or higher, then 2

If OPTIMIZER_FEATURES_ENABLE is set to 9.2.0, then 1

If OPTIMIZER_FEATURES_ENABLE is set to 9.0.1 or lower, then 0

Modifiable

ALTER SESSIONALTER SYSTEM

Range of values

0 to 10

 

 

Dynamic Sampling Levels

 

10g以上oracle database 的OPTIMIZER_DYNAMIC_SAMPLING参数默认值为2。

 

1.2 应用场景

下面列举3个动态采样的典型应用场景

1.2.1    缺失统计信息

当查询中的一个或者多个表没有统计信息,那么优化器就会收集关于表的基本信息用来执行优化操作。

 

1.创建表

 

 

dexter@DAVID> create table tuning8_tab1nologging as

  2  select level as id , 'name'|| level as name

  3  from dual

  4  connect by level <= 10000 ;

 

Table created.

2.创建索引

_dexter@DAVID> create indexidx_tuning8_tab1_id on tuning8_tab1(id) ;

 

Index created.

3.查询测试

先看一下参数的设置

_dexter@DAVID> show parameter samp

 

NAME                                 TYPE        VALUE

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

optimizer_dynamic_sampling           integer     2

 

 

_dexter@DAVID> select * from tuning8_tab1where id=2 ;

 

       ID NAME

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

        2 name2

 

 

Execution Plan

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

Plan hash value: 3712969662

 

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

| Id  | Operation       &