使用 DBMS_STATS 包收集直方图信息,DBMS_STATS 包中参数 METHOD_OPT 可接受的参数如下:
- FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]
- FOR COLUMNS [size clause] column|attribute [size_clause] [,column|attribute [size_clause]...]
其中 size 必须符合如下格式:
size_clause is defined as size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}
size_clause 子句中各选项的含义如下:
1) integer : 直方图的 Bucket 的数量,必须在 1 - 254 范围内,1表示删除目标列上的直方图统计信息
2) REPEAT : 只对已经有直方图统计信息的列收集直方图统计信息
3) AUTO : 让Oracle自行决定是否对目标列收集直方图统计信息,以及使用哪种类型的直方图
4) SKEWONLY: 只对数据分布不均衡的列收集直方图统计信息
Examples:
1、对所有有索引的列以自动方式收集直方图统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('COMTRADE', 'COMTRADE_DATASET', METHOD_OPT=>'FOR ALL INDEXED COLUMNS SIZE AUTO', ESTIMATE_PERCENT=>100);
2、对目标表上的 YR、PTCODE 两个列以自动方式收集直方图信息:
EXEC DBMS_STATS.GATHER_TABLE_STATS('COMTRADE', 'COMTRADE_DATASET', METHOD_OPT=>'FOR COLUMNS SIZE AUTO YR PTCODE', ESTIMATE_PERCENT=>100);
3、对目标表上的 YR、PTCODE 两个列以自动方式收集直方图信息,同时指定 Bucket 数量为10:
EXEC DBMS_STATS.GATHER_TABLE_STATS('COMTRADE', 'COMTRADE_DATASET', METHOD_OPT=>'FOR COLUMNS SIZE 10 YR PTCODE', ESTIMATE_PERCENT=>100);
4、对目标表上的 YR、PTCODE 两个列以自动方式收集直方图信息,同时指定 YR 列的 Bucket 数量为10,PTCODE 列的 Bucket 数量为5:
EXEC DBMS_STATS.GATHER_TABLE_STATS('COMTRADE', 'COMTRADE_DATASET', METHOD_OPT=>'FOR COLUMNS YR SIZE 10 PTCODE SIZE 5', ESTIMATE_PERCENT=>100);
5、删除列 PTCODE 上的直方图统计信息:
EXEC DBMS_STATS.GATHER_TABLE_STATS('COMTRADE', 'COMTRADE_DATASET', METHOD_OPT=>'FOR COLUMNS PTCODE SIZE 1', ESTIMATE_PERCENT=>100);
6、删除目标表上是所有直方图统计信息:
EXEC DBMS_STATS.GATHER_TABLE_STATS('COMTRADE', 'COMTRADE_DATASET', METHOD_OPT=>'FOR ALL COLUMNS SIZE 1', ESTIMATE_PERCENT=>100);




