直方图,一种特殊类型的列的统计信息,它能提供表中列的更详细的数据分布信息,直方图将值存放于桶(buckets)中。基于不同值的数目和数据的分布,数据库选择要创建的直方图类型,直方图的类型有如下几种:
- 频率直方图和顶频直方图:Frequency histograms and to frequency histograms;
- 高度平衡直方图(遗留):Height-Balanced hitograms;
- 混合柱状图:Hybrid histograms;
1 直方图介绍
1.1 使用直方图的目的
默认情况下,优化器假定列的不同值之间时均匀分布的。对于包含数据倾斜列(列中数据的分布不均匀的列),直方图使优化器能够为涉及这些列的过滤或连接谓词生成更准确的基数的估计值,从而生成更精确的执行计划。
1.2 何时数据库创建直方图
使用DBMS_STATS搜集表的统计信息,查询引用表中的列时,数据库会根据之前的查询负载来自动的创建直方图。基本过程如下:
- 使用DBMS_STATS搜集表的统计信息,且指定METHOD_OPT参数默认为SIZE AUTO;
- 用户查询对应的表;
- 数据库记录前面查询时使用的谓词,并更新数据字典表SYS.COL_USAGE$;
- 再次运行DBMS_STATS时,DBMS_STATS会查询SYS.COL_USAGE$视图并根据前面的查询负载决定哪些列需要直方图。
示例:
1)创建测试表
SQL> create table sh.sales_new as select * from sh.sales;
Table created.
2)查看统计信息
SQL> select column_name,notes,histogram from dba_tab_col_statistics where owner='SH' and table_name='SALES_NEW';
COLUMN_NAME NOTES HISTOGRAM
------------------------------ ------------------------------ ---------------
AMOUNT_SOLD STATS_ON_LOAD NONE
QUANTITY_SOLD STATS_ON_LOAD NONE
PROMO_ID STATS_ON_LOAD NONE
CHANNEL_ID STATS_ON_LOAD NONE
TIME_ID STATS_ON_LOAD NONE
CUST_ID STATS_ON_LOAD NONE
PROD_ID STATS_ON_LOAD NONE
7 rows selected.
3)执行查询
SQL> select column_name,notes,histogram from dba_tab_col_statistics where owner='SH' and table_name='SALES_NEW';
COLUMN_NAME NOTES HISTOGRAM
------------------------------ ------------------------------ ---------------
AMOUNT_SOLD STATS_ON_LOAD NONE
QUANTITY_SOLD STATS_ON_LOAD NONE
PROMO_ID STATS_ON_LOAD NONE
CHANNEL_ID STATS_ON_LOAD NONE
TIME_ID STATS_ON_LOAD NONE
CUST_ID STATS_ON_LOAD NONE
PROD_ID STATS_ON_LOAD NONE
7 rows selected.
4)搜集统计信息
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SH','SALES_NEW',OPTIONS=>'GATHER AUTO');
PL/SQL procedure successfully completed.