前言
优化统计信息描述了数据库中的对象细节。查询优化使用这些信息选择最合适的执行计划。使用DBMS_STATS包来收集统计、删除信息,将收集的统计信息记录在数据字典中。
DBMS_STATS 包中涉及到类型,如下统一说明。
OBJECTELEM 类型是 DBMS_STATS 专有类型。用户不能引用和改变该记录的内容。
OBJECTELEM 记录类型定义如下:
TYPE OBJECTELEM IS RECORD (
OWNNAME VARCHAR(128) ,
OBJTYPE VARCHAR(6) ,
OBJNAME VARCHAR(128) ,
PARTNAME VARCHAR(128) ,
SUBPARTNAME VARCHAR(128)
) ;
参数详解
OWNNAME 模式名。
OBJTYPE 对象类型,TABLE 或 INDEX。
OBJNAME 对象(表或索引)名称,区分大小写。
PARTNAME 分区名称,区分大小写。
SUBPARTNAME 子分区名称,区分大小写。
OBJECTTAB 为 OBJECTELEM 类型的索引表:
TYPE OBJECTTAB IS TABLE OF OBJECTELEM INDEX BY IN
测试环境:
操作系统:中标麒麟6
达梦数据库:DMV8.1
相关案例分析:
使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_STATS');
案例1:
收集模式DMHR模式下EMPLOYEE表的统计信息,并打印收集的表信息。
使用方法:GATHER_SCHEMA_STATS
收集模式下对象的统计信息。
打印结果
语法如下:
PROCEDURE GATHER_SCHEMA_STATS (
OWNNAME VARCHAR(128),
ESTIMATE_PERCENT DOUBLE DEFAULT
TO_ESTIMATE_PERCENT_TYPE(GET_PREFS('ESTIMATE_PERCENT')),
BLOCK_SAMPLE BOOLEAN DEFAULT FALSE,
METHOD_OPT VARCHAR DEFAULT GET_PREFS('METHOD_OPT'),
DEGREE INT DEFAULT TO_DEGREE_TYPE(GET_PREFS('DEGREE')),
GRANULARITY VARCHAR DEFAULT GET_PREFS('GRANULARITY'),
CASCADE BOOLEAN DEFAULT TO_CASCADE_TYPE(GET_PREFS('CASCADE')),
STATTAB VARCHAR DEFAULT NULL,
STATID VARCHAR DEFAULT NULL,
OPTIONS VARCHAR DEFAULT 'GATHER',
OBJLIST OUT OBJECTTAB DEFAULT NULL,
STATOWN VARCHAR DEFAULT NULL,
NO_INVALIDATE BOOLEAN DEFAULT TO_NO_INVALIDATE_TYPE
(GET_PREFS('NO_INVALIDATE')),
FORCE BOOLEAN DEFAULT FALSE,
OBJ_FILTER_LIST OBJECTTAB DEFAULT NULL
参数详解:
• OWNNAME 模式名,区分大小写。
• ESTIMATE_PERCENT 收集的百分比,范围为 0.000001~100,默认系统自定。
• BLOCK_SAMPLE 保留参数,是否使用随机块代替随机行,默认为 TRUE。
• METHOD_OPT 控制列的统计信息集合和直方图的创建;
默认为 FOR ALL COULMNS SIZE AUTO;只支持其中一种格式:
FOR ALL [INDEXED | HIDDEN] COLUMNS [<size_clause>]
<size_clause>::= SIZE {integer | REPEAT | AUTO | SKEWONLY}
• DEGREE 保留参数,收集的并行度,默认为 1。
• GRANULARITY 保留参数,收集的粒度,默认为 ALL。
• CASCADE 是否收集索引信息,TRUE 或 FALSE。默认为 TRUE。
• STATTAB 保留参数,统计信息存放的表,默认为 NULL。
• STATID 保留参数,统计信息的 ID,默认为 NULL。
• OPTIONS
控制收集的列,默认为 NULL ;选项如下:
GATHER|GATHER AUTO|GATHER STALE|GATHER EMPTY|LIST AUTO|LIST STALE|LIST EMPTY。
各选项解释如下:
• GATHER:收集模式下所有对象的统计信息。
• GATHER AUTO:自动收集需要的统计信息。系统隐含的决定哪些对象需要新的统计信息,以及怎样收集这些统计信息。此时,只有 OWNNAME,STATTAB,STATID,OBJLIST AND STATOWN有效,返回收集统计信息的对象。
• GATHER STALE:对旧的对象收集统计信息。返回找到的旧的对象。
• GATHER EMPTY:收集没有统计信息对象的统计信息。返回这些对象。
• LIST AUTO:返回GATHER AUTO方式处理的对象。
• LIST STALE:返回旧的对象信息。
• LIST EMPTY:返回没有统计信息的对象。
• OBJLIST 返回 OPTION 选项对应的链表,默认为 NULL。
• STATOWN 保留参数,统计信息的模式,默认为 NULL。
• NO_INVALIDATE 保留参数,是否让依赖游标失效,默认为 TRUE。
• FORCE 保留参数,是否强制收集统计信息,默认为 FALSE。
• OBJ_FILTER_LIST 存放过滤条件的模式名、表名和子表名,默认为 NULL
案例2:
获得 DMHR 模式下表 EMPLOYEE 中列 HIRE_DATE 的统计信息。
使用方法:COLUMN_STATS_SHOW
根据模式名,表名和列名获得该列的统计信息。返回两个结果集:一个是列的统计信息;另一个是直方图的统计信息。
DBMS_STATS.COLUMN_STATS_SHOW('DMHR','EMPLOYEE','HIRE_DATE');
返回结果集:
语法如下:
PROCEDURE COLUMN_STATS_SHOW (
OWNNAME IN VARCHAR(128),
TABNAME IN VARCHAR(128),
COLNAME INVARCHAR(128)
);
列的统计信息,格式分别如下:
名称 | 解释 |
---|---|
NUM_DISTINCT | 不同列值的个数 |
LOW_VALUE | 列最小值 |
HIGH_VALUE | 列最大值 |
NUM_NULLS | 空值的个数 |
NUM_BUCKETS | 直方图桶的个数 |
SAMPLE_SIZE | 样本容量 |
HISTOGRAM | 直方图的类型 |
参数详解:
• OWNNAME 模式名,区分大小写。
• TABNAME 表名,区分大小写。
• COLNAME 列名,区分大小写。
不适用范围
以下对象不支持统计信息:
- 外部表、DBLINK 远程表、动态视图表、记录类型数组所用的临时表。
- 所在表空间为 OFFLINE 的对象。
- 位图索引,位图连接索引、虚索引、全文索引、空间索引、数组索引、无效的索引。
- BLOB、IMAGE、LONGVARBINARY、CLOB、TEXT、LONGVARCHAR、自定义类型列和空间类型列等列类型。
关于DBMS_STATS更多的使用方法,请查阅官方相关手册。