Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


DBMS_STAT系统包

📄字数 5.6K
👁️阅读量 加载中...

一、概述

DBMS_STAT系统包是一个统计信息管理系统包,用于对数据库表、列对象进行统计信息采集与维护。统计信息是优化器进行SQL执行计划选择的关键依据,主要包括列对象的最大值、最小值、、重复度、离散度、直方图等统计信息,它帮助数据库准确判断表数据的分布情况,从而做出更优的执行决策。

在该系统包中提供了以下接口:

包体函数名简要描述
ANALYZE_TABLE用于手动收集统计信息,支持全表、指定列
GET_STAT_INFO获取收集的表对象统计信息
SET_STAT_INFO手动设置列对象的统计信息
SET_ANALYZE_COLUMNS开启或者关闭列对象统计
SET_ANALYZE_SCHEME设置表对象的分析策略,如定时分析、立即分析等
SET_ANALYZE_PARAM表对象的特定分析设置,如只分析索引列、数字列
SET_ANALYZE_OPTIMIZE针对索引列,设置表对象的分析参数,如只收集索引的所有叶子块

典型应用场景,如:

  • 查询缓慢,优化器执行计划异常,可能因为统计信息过旧或不准确,使用ANALYZE_TABLE手动采集统计信息
  • 插入、更新大批数据后需更新统计信息,使用ANALYZE_TABLE手动刷新
  • 模拟特定分布进行测试时,使用SET_STAT_INFO人工设置列统计值用于调优
  • 使用SET_ANALYZE_COLUMNS、SET_ANALYZE_SCHEME、SET_ANALYZE_PARAM、SET_ANALYZE_OPTIMIZE进行自动分析参数设置

提示

SET_ANALYZE_COLUMNS、SET_ANALYZE_SCHEME、SET_ANALYZE_PARAM、SET_ANALYZE_OPTIMIZE是用于自动分析中的参数设置

二、ANALYZE_TABLE

2.1 功能描述

该接口用于对表对象上的列进行统计信息收集。统计信息包括最大值、最小值、重复度、离散值、非空率、直方图。统计信息存储于系统表SYS_COLUMNS中

说明

虚谷数据库V12.7版本引入了基于压缩直方图(Compressed Histogram)的统计功能,能够显著提升查询优化器的选择率估算精度。通过开启直方图统计,系统会自动生成最常见值(MCV,Most Common Values)列表和直方图列表,帮助优化器更好地理解数据分布,即使在数据分布不均匀的情况下也能提供更准确的选择率估算。

2.2 方法声明

sql
PROCEDURE ANALYZE_TABLE (
    TABLE_NAME     VARCHAR,
    FIELD_NAME     VARCHAR,
    SAMPLE_RATE    INTEGER,
    HISTOGRAM_NUM  INTEGER,
    AUTO_ADJUST    BOOL DEFAULT TRUE,
    PARALLEL       INTEGER DEFAULT 1
);

2.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR指定收集的表对象,该参数要求指定模式名
FIELD_NAMEVARCHAR指定收集的列对象
SAMPLE_RATEINTEGER[1,100]采样间隔
HISTOGRAM_NUMINTEGER[0,256]直方图桶数
AUTO_ADJUSTBOOLTRUE/FALSE是,默认为TRUE自动调整采样间隔
PARALLELINTEGER[1,8]是,默认为1并行度
  • 对于FIELD_NAME参数,其有多个选项:ALL COLUMNS、ALL INDEX COLUMNS、指定多列、单列。ALL COLUMNS表示收集所有列统计信息,ALL INDEX COLUMNS表示收集所有索引列统计信息

提示

1、采样间隔小于1时,系统默认置为1;大于100时,默认置为100;
2、直方图桶数小于0或者大于256时,系统默认置为100;
3、直方图统计信息在以下情况均满足的情况下进行收集:HISTOGRAM_NUM不为0且表数据量>=(300 * HISTOGRAM_NUM);
4、并行度小于1时,系统默认置为1;大于8时,默认置为8;

2.4 示例

sql
-- 创建表T_ANA
SQL> CREATE TABLE T_ANA (id INT, c1 VARCHAR2(100));

-- 插入数据
SQL> BEGIN
       FOR i IN 1..100 LOOP
         INSERT INTO T_ANA (id, c1)
         VALUES (i, '数据-' || TO_CHAR(i));
       END LOOP;
     END;
     /

-- 收集表T_ANA所有列统计信息(默认不收集直方图)
SQL> EXEC DBMS_STAT.ANALYZE_TABLE('SYSDBA.T_ANA','ALL COLUMNS',1,NULL);

-- 收集表T_ANA指定列C1统计信息,包含直方图,桶数设置为100
SQL> EXEC DBMS_STAT.ANALYZE_TABLE('SYSDBA.T_ANA','c1',1,100);

-- 收集表T_ANA指定列C1统计信息,包含直方图,桶数设置为100,设置并行度为4
SQL> EXEC DBMS_STAT.ANALYZE_TABLE('SYSDBA.T_ANA','C1',1,100,false,4);

2.5 场景应用

  • 场景一:当数据库中新增表或向表中插入更新大量数据时,此时优化器还未能识别数据的分布特征,可以手动执行ANALYZE_TABLE进行统计信息收集
  • 场景二:当执行某些SQL发现执行计划异常时,怀疑是统计信息不准,此时可以针对涉及的表手动收集
  • 场景三:自动表分析下,默认允许自动调整采样间隔,可能出现统计信息不准,此时可以指定较小的采样间隔来手动执行表分析
  • 场景四:由于直方图默认不收集,但当某些列值分布倾斜严重,导致估算错误,此时可以手动搜集直方图统计信息,并开启直方图优化

三、GET_STAT_INFO

3.1 功能描述

该接口用于获取表上所有列的统计信息

3.2 方法声明

sql
FUNCTION GET_STAT_INFO(TABLE_NAME VARCHAR) RETURN VARCHAR;

3.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR指定收集的表对象,该参数要求指定模式名

3.4 示例

sql
-- 查询表T_ANA所有列统计信息
SQL> SELECT DBMS_STAT.GET_STAT_INFO('SYSDBA.T_ANA') FROM dual;

+--------------------------------------------------------------------------------------------------------------------+
|                                                       EXPR1                                                        |
+--------------------------------------------------------------------------------------------------------------------+
| TABLE(SYSDBA.T_ANA) TOTAL ROW NUM: 100                                                                            +|
| ANALYZE PARAMS: policy=>TIME/  threshold=>0  level=>0  period=>0                                                  +|
| COLUMNS ATTRIBUTES:                                                                                               +|
| col_no:0  col_name:ID  type_name:INTEGER ana_flag:0  repeat:1 dist:100 min_val:1 max_val:100 non_null_rate:1      +|
| col_no:1  col_name:C1  type_name:CHAR ana_flag:0  repeat:1 dist:100 min_val:数据-1 max_val:数据-99 non_null_rate:1+|
|                                                                                                                    |
+--------------------------------------------------------------------------------------------------------------------+

-- TOTAL ROW NUM表示表总数据量
-- ANALYZE PARAMS表示当前表的参数设置,policy为分析策略,threshold为触发分析阈值,level为采样层级,period为分析周期
-- COLUMNS ATTRIBUTES表示每一列的统计信息,分别为列号,列名,列数据类型,是否允许分析,重复度、离散度、最小值、最大值、非空率、最常出现的值、直方图列表(后两者需进行直方图统计)

3.5 场景应用

  • 查询统计分析数据

四、SET_STAT_INFO

4.1 功能描述

手动设置统计信息,是一种人为干预优化器行为的手段,其通常用于运维和客户支持中指定的明确且必要的应用场景。支持设置列对象的统计值,包括最大值、最小值、重复度、离散度、非空率,直方图不支持手动设置

4.2 方法声明

sql
PROCEDURE SET_STAT_INFO (
    TABLE_NAME      VARCHAR,
    FIELD_NAME      VARCHAR,
    MAX_VAL         VARCHAR,
    MIN_VAL         VARCHAR,
    REPET_RATE      DOUBLE,
    DISPERSION      DOUBLE,
    NON_NULL_RATE   DOUBLE DEFAULT 0.0
);

4.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR指定设置的表对象,该参数要求指定模式名
FIELD_NAMEVARCHAR指定设置的列对象
MAX_VALVARCHAR最大值
MIN_VALVARCHAR最小值
REPET_RATEDOUBLE重复度
DISPERSIONDOUBLE离散度
NON_NULL_RATEDOUBLE[0.0,1.0]是,默认为0.0非空率

4.4 示例

sql
-- 对T_ANA表上的C1列设置统计信息
SQL> EXEC DBMS_STAT.SET_STAT_INFO('SYSDBA.T_ANA','C1',100,1,1,100,0.1);

4.5 场景应用

  • 场景一:若某张超大表收集统计信息太耗时,此时可以直接设置一个合适的值,临时优化执行计划
  • 场景二:在测试环境中,人为地制造“倾斜数据”、“空表”等场景,模拟极端数据分布
  • 场景三:解决执行计划错误,但又不方便修改SQL的情况

五、SET_ANALYZE_COLUMNS

5.1 功能描述

用于开启或者关闭列统计,避免进行不必要的统计信息收集

5.2 方法声明

sql
PROCEDURE SET_STAT_INFO (
    TABLE_NAME      VARCHAR,
    FIELD_NAME      VARCHAR,
    STATUS          TINYINT
);

5.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR指定收集的表对象,该参数要求指定模式名
FIELD_NAMEVARCHAR指定收集的列对象
STATUSTINYINT0/1/20表示未指定,1表示允许,2表示禁止

5.4 示例

sql
-- 将表T_ANA上的C1列显式设置为允许分析
SQL> EXEC DBMS_STAT.SET_ANALYZE_COLUMNS('SYSDBA.T_ANA','c1',1);

5.5 场景应用

  • 场景一:在某些表关联复杂、SQL性能敏感,当前统计信息表现稳定的情况下,自动表分析更新统计信息可能导致执行计划突变,此时可以锁定该表统计信息,禁止分析
  • 场景二:某些表极大,分析成本过高,此时可以跳过这些表,提升统计任务整体效率

六、SET_ANALYZE_SCHEME

6.1 功能描述

用于自动分析时控制表对象上的行为,包括定时分析、立即分析、优化分析

6.2 方法声明

sql
PROCEDURE SET_ANALYZE_SCHEME (
    TABLE_NAME      VARCHAR,
    SCHE_NAME       VARCHAR,
    ENABLE          BOOL
);

6.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR指定收集的表对象,该参数要求指定模式名
SCHE_NAMEVARCHARALL/TIME/IMME/OPTITIME表示定时分析,IMME表示立即分析,OPTI表示优化分析,ALL为三者
ENABLEBOOLTRUE/FALSETRUE表示允许,FALSE表示禁止

6.4 示例

sql
-- 允许T_ANA表对象的定时分析行为
SQL> EXEC DBMS_STAT.SET_ANALYZE_SCHEME('SYSDBA.T_ANA','TIME',TRUE);

6.5 场景应用

  • 场景一:自动表分析一般设置在每日夜间进行,若某张表不需要进行定时分析,此时可以关闭该表对象的定时分析行为
  • 场景二:某业务核心表需要确保即使数据发生变更,执行计划不波动,此时可以关闭表对象的所有分析行为
  • 场景三:导入某张表后马上可以进行报表分析,报表依赖最新数据查询,此时可以设置表对象为允许立即分析
  • 场景四:当表字段众多,分析全部字段浪费资源,此时可以开启优化分析来仅限索引列

七、SET_ANALYZE_PARAM

7.1 功能描述

用于自动分析时设置表对象的特定分析参数,是实现精细化控制的关键手段,包括设置对象分析模式、分析阈值、采样层级

7.2 方法声明

sql
PROCEDURE SET_ANALYZE_PARAM (
    TABLE_NAME      VARCHAR,
    MODE            TINYINT,
    THRESHOLD       TINYINT,
    LEVEL           TINYINT
);

7.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR指定收集的表对象,该参数要求指定模式名
MODETINYINT1/2分析模式,指定值为1表示只对索引列和显式允许分析的列进行分析,2则表示还需对数字、日期类字段分析
THRESHOLDTINYINT[1,100]阈值触发变化率,1-100表示当前变化的数据量占表总数据量的比例
LEVELTINYINT[1,6]采样层级,1-6对应的采样间隔分别为32/16/8/4/2/1,采样间隔越小则需要收集的统计分析数据量越多

7.4 示例

sql
-- 设置表T_ANA的分析模式为1,阈值触发率为1%,采样层级为1
SQL> EXEC DBMS_STAT.SET_ANALYZE_PARAM('SYSDBA.T_ANA',1,1,1);

7.5 场景应用

  • 场景一:当表字段非常多,但大部分字段不参与查询计划,此时可以指定模式MODE只分析索引列等
  • 场景二:表数据频繁写入但变动不影响查询计划,此时可以提高阈值触发比例THRESHOLD,变更较大才进行分析
  • 场景三:某张表分析时间过长,此时可以兼顾分析时间和质量,采用合适的采样LEVEL

八、SET_ANALYZE_OPTIMIZE

8.1 功能描述

用于自动分析时设置对象的优化分析参数

8.2 方法声明

sql
PROCEDURE SET_ANALYZE_OPTIMIZE (
    TABLE_NAME      VARCHAR,
    PERIOD          SMALLINT,
    MODE            TINYINT
);

8.3 参数说明

参数名类型取值范围是否可选描述
TABLE_NAMEVARCHAR指定收集的表对象,该参数要求指定模式名
PERIODSMALLINT[30,1440]优化分析的周期(分钟)
MODETINYINT1/2/31表示采集索引列的meta0级块,2表示采集索引列的meta1级块,3表示采集索引的所有叶子块

8.4 示例

sql
-- 设置T_ANA表上的分析周期为10分钟,且只采集索引列的meta0级块
SQL> EXEC DBMS_STAT.SET_ANALYZE_OPTIMIZE('SYSDBA.T_ANA',10,1);

8.5 场景应用

  • 某些场景下,仅需要收集索引列统计信息,且需要加速统计信息收集效率

九、相关系统表与视图