在Oracle数据库中,优化器欲产生最优的执行计划,需要依赖于相关对象的统计信息的搜集。数据库可以自动的搜集执行计划,也可以使用程序包DBMS_STATS进行手动搜集,本篇对常规统计信息的搜集不做说明,重点演示下关于扩展的统计信息(Extended Statistics)的的搜集。
1 扩展的统计信息介绍
在执行SQL时,where条件后的单个列的统计信息很容易去决定对应列的谓词的选择性,但是,如果where条件后包含同一张表的多个列作为谓词时,那么单个列的统计信息就不能显示出列之间的关系了,这时,优化器根据单列的统计信息得到的执行计划就可能不是最优的了。这个问题可以通过列组(column group)来解决,通过对列组进行统计信息的搜集,来反映一组列的相互关系,从而使优化器选择最优的执行计划,列组的统计信息称为扩展的统计信息。Oracle中,扩展的统计信息包含:
- 列组统计信息: 当一张表的多个列同时出现在一条SQL语句时,这种类型的扩展统计信息可以改进基数估计
- 表达式统计信息:当对谓词使用表达式时,这种类型的统计信息可以改进优化器评估。
如图:展示了sh.customers表中两个列cust_state_province和contry_id列的统计信息,以及这两个列组成的列组的统计信息,列组的名称是由系统产生。
2 使用常规统计信息
1)实验环境
SQL> select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
PL/SQL Release 12.1.0.2.0 - Production 0
CORE 12.1.0.2.0 Production 0
TNS for Linux: Version 12.1.0.2.0 - Production 0
NLSRTL Version 12.1.0.2.0 - Production 0
2)构建测试数据
SQL> create table sh.customers_new as select * from sh.customers;
Table created.
SQL> exec dbms_stats.gather_table_