展,指的是列的组合,或者是基于列的表达式。
有如下的例子:
HR@ORCL> alter table hr.employees no flashback archive;
HR@ORCL> select dbms_stats.create_extended_stats('hr','employees','(first_name,last_name,job_id)') from dual;
HR@ORCL> exec dbms_stats.gather_table_stats('hr','employees',method_opt=>'for all columns size 1,for columns (first_name,last_name,job_id) size auto');
HR@ORCL> select * from user_stat_extensions where table_name='EMPLOYEES';
注:扩展统计信息中的列组,与复合索引;
扩展统计信息中的基于列的表达式,与函数索引
它们在影响执行计划的时候有何不同?
另注:自动收集统计信息时,不会收集扩展统计信息。
1.2.2.4 estimate_percent参数分析
GATHER_DATABASE_STATS
GATHER_DICTIONARY_STATS
GATHER_INDEX_STATS
GATHER_SCHEMA_STATS
GATHER_TABLE_STATS
以上五个收集统计信息的过程,都包含了estimate_percent这个参数。
在12.1的官方文档中,oracle对该参数的解释如下:
该参数指定了在收集统计信息时对行采样的百分比(NULL表示全部采样)。其可用值的范围为【0.000001,100】。
可以使用常量DBMS_STATS.AUTO_SAMPLE_SIZE来让oracle自己决定采取适当的数值来收集统计信息。这也是默认行为。
该默认值可以通过
SET_DATABASE_PREFS,
SET_GLOBAL_PREFS,
SET_SCHEMA_PREFS,
SET_TABLE_PREFS进行修改。
注:在设置这些默认项之后,也会作用于统计信息的自动收集。
可以使用dbms_stats.get_prefs获取当前系统与统计信息相关的参数的默认值。
可以获取的参数包括
■ AUTOSTATS_TARGET
■ CASCADE
■ CONCURRENT
■ DEGREE
■ ESTIMATE_PERCENT
■ METHOD_OPT
■ NO_INVALIDATE
■ GRANULARITY
■ PUBLISH
■ INCREMENTAL
■ INCREMENTAL_LEVEL
■ INCREMENTAL_STALENESS
■ STALE_PERCENT
■ GLOBAL_TEMP_TABLE_STATS
■ TABLE_CACHED_BLOCKS
■ OPTIONS
其中,
get_prefs用于获取全局的统计信息收集配置选项。
要获取对象级别的统计信息配置选项:
SELECT * FROM DBA_TAB_STAT_PREFS;
例子如下:
SQL> select dbms_stats.get_prefs('estimate_percent') name from dual;
NAME
--------------------------------------------------------------------------------
DBMS_STATS.AUTO_SAMPLE_SIZE
按照oracle的解释,AUTO_SAMPLE_SIZE为一个常量,其值可以通过如下方式获取:
Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.1.0
Connected as sys@ORCL AS SYSDBA
SQL> create table t_val (name varchar2(30),value number);
Table created
SQL> begin
2 insert into t_val values ('AUTO_SAMPLE_SIZE',DBMS_STATS.AUTO_SAMPLE_SIZE);
3 end;
4 /
PL/SQL procedure successfully completed
SQL> select * from t_val;
NAME VALUE
--------------------------- ----------
AUTO_SAMPLE_SIZE 0
显然这不是我们想要的值。
按照oracle的说明,该值的取值范围,也应该在【0.000001,100】之间。
我们可以设计一个实验,来获取该值的一个近似值。
SQL> create table t as select * from dba_objects;
Table created
SQL> set timing on;
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T',estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE);
PL/SQL procedure successfully completed
Executed in 0.608 seconds
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T',estimate_percent => NULL);
PL/SQL procedure successfully completed
Executed in 0.999 seconds
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T',estimate_percent => 100);
PL/SQL procedure successfully completed
Executed in 0.889 seconds
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T',estimate_percent => 50);
PL/SQL procedure successfully completed
Executed in 0.483 seconds
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T');
PL/SQL procedure successfully completed
Executed in 0.234 seconds
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T',estimate_percent => 60);
PL/SQL procedure successfully completed
Executed in 0.577 seconds
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'T',estimate_percent => 62);
PL/SQL procedure successfully co