手动统计信息收集
更新时间:2023-09-04 18:10:37
编辑
分享
目前 OceanBase 数据库优化器针对手动统计信息收集提供了两种方式:DBMS_STATS
(推荐)、ANALYZE
命令行;推荐使用 DBMS_STATS
系统包进行手动统计信息收集,因为 DBMS_STATS
系统包支持的功能会更加丰富。
DBMS_STATS 系统包统计信息收集
在 OceanBase 数据库 V4.0 版本中,不管是 Oracle 模式还是 MySQL 模式都可以使用 DBMS_STATS
系统包进行手动统计信息收集,其中最常用的两个系统包的 PROCEDURE 是:GATHER_TABLE_STATS
和 GATHER_SCHEMA_STATS
,前者用于收集某张表的统计信息,后者用于收集某个库中所有表的统计信息。下边展示了两个 PROCEDURE 的基本定义。
说明
有关 `DBMS_STATS` 系统包的详细信息,参见 [DBMS_STATS 概述(MySQL 模式)](../../../../../../../700.reference/400.development-reference/300.pl-reference/200.pl-mysql/1000.pl-system-package-mysql/15900.dbms-stats-mysql/100.dbms-stats-overview-mysql.md) 和 [DBMS_STATS 概述(Oracle 模式)](../../../../../../../700.reference/400.development-reference/300.pl-reference/300.pl-oracle/1400.pl-system-package-oracle/15900.dbms-stats-oracle/100.dbms-stats-overview-oracle.md)。
PROCEDURE gather_table_stats (
ownname VARCHAR2,
tabname VARCHAR2,
partname VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT AUTO_SAMPLE_SIZE,
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT DEFAULT_METHOD_OPT,
degree NUMBER DEFAULT NULL,
granularity VARCHAR2 DEFAULT DEFAULT_GRANULARITY,
cascade BOOLEAN DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT FALSE,
stattype VARCHAR2 DEFAULT 'DATA',
force BOOLEAN DEFAULT FALSE
);
PROCEDURE gather_schema_stats (
ownname VARCHAR2,
estimate_percent NUMBER DEFAULT AUTO_SAMPLE_SIZE,
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT DEFAULT_METHOD_OPT,
degree NUMBER DEFAULT NULL,
granularity VARCHAR2 DEFAULT DEFAULT_GRANULARITY,
cascade BOOLEAN DEFAULT NULL,
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT FALSE,
stattype VARCHAR2 DEFAULT 'DATA',
force BOOLEAN DEFAULT FALSE
);
参数详解:
-
ownname
:用户名,如果用户名设置为 NULL,会默认使用当前登录用户名。 -
tabname
:表名。 -
partname
:分区名,默认为 NULL。 -
estimate_percent
:指定使用多少比例的数据计算其分布特征,范围为 [0.000001,100],如果指定为 NULL,则使用所有数据;默认是 AUTO_SAMPLE_SIZE,由优化器内部决定使用多少比例的数据,如无特殊需求,可以不用指定,直接使用默认值即可。 -
block_sample
:是否使用块采样代替行采样,默认是 FALSE 的。 -
method_opt
:设置列级别的统计信息收集方式,主要采用下面的语法方式来设定:method_opt: FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause] | FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...] size_clause: SIZE integer | SIZE REPEAT | SIZE AUTO | SIZE SKEWONLY column: column_name | (column_name [, column_name])
integer
:指定收集列的直方图桶的个数,范围在 [1-2048]。REPEAT
:仅仅只收集已经有收集过的直方图的列的直方图;使用之前收集直方图设置的桶个数。AUTO
:由 OceanBase 数据库优化器来决定是否收集列的直方图,取决于列的使用情况,桶个数使用默认值为 254。SKEWONLY
:仅仅只收集数据分布不均匀的列的直方图;直方图桶个数使用默认值为 254。
-
degree
:统计信息收集时的并行度,默认是 NULL,使用 prefs 配置的并行度(默认为 1)。 -
granularity
:统计信息收集时的分区粒度,目前支持以下几种设置:'GLOBAL'
:收集全局级别的统计信息。'PARTITION'
:收集分区级别的统计信息。'SUBPARTITION'
:收集子分区级别的统计信息。'ALL'
:收集所有的统计信息(GLOBAL、PARTITION、SUBPARTITION)。'AUTO'
:使用默认方式收集(GLOBAL、PARTITION、SUBPARTITION) 统计信息,这个是默认值。'DEFAULT'
:收集 GLOBAL、PATITION 级别的统计信息。'GLOBAL AND PARTITION'
:收集全局、分区级别的统计信息。'APPROX_GLOBAL AND PARTITION'
:收集分区级别的统计信息并根据分区信息推导出全局级别的统计信息。
-
cascade
:是否同时收集表的索引统计信息,默认为 TRUE。 -
stattab
:暂未实现,不可用。 -
statid
:暂未实现,不可用。 -
statown
:暂未实现,不可用。 -
no_invalidate
:暂未实现,不可用。 -
stattype
:暂未实现,不可用。 -
force
:是否强制收集统计信息,忽略锁的状态,默认 FALSE。
示例
示例一:收集用户 TEST
的表 T1
的全局级别的统计信息,所有列的桶个数设定为 128
call dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE 128');
示例二:收集用户 TEST
的表 T_PART1
的分区级别的统计信息,并行度 64,只收集数据分布不均匀的列的直方图
call dbms_stats.gather_table_stats('TEST', 'T_PART1', degree=>64, granularity=>'PARTITION', method_opt=>'FOR ALL COLUMNS SIZE SKEWONLY');
示例三:收集用户 TEST
的表 T_SUBPART1
所有的统计信息,并行度 128,只收集 50% 的数据,所有的列的直方图都由优化器内部决定
call dbms_stats.gather_table_stats('TEST', 'T_SUBPART1', degree=>64, estimate_percent=> '50', granularity=>'ALL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
示例四:收集用户 TEST
的所有表统计信息,并行度 128
call dbms_stats.gather_schema_stats('TEST', degree=>128);
ANALYZE 命令行统计信息搜集
除了使用 DBMS_STATS
系统包收集统计信息以外,在 OceanBase 数据库的 Oracle 模式和 MySQL 模式都可以使用 ANALYZE
语句进行统计信息的收集。具体的语法为:
analyze_stmt:
ANALYZE TABLE table_name [use_partition] analyze_statistics_clause
use_partition:
PARTITION (parition_name [,partition_name,....])
| SUBPARTITION(subpartition_name, [,subpartition_name,...])
analyze_statistics_clause:
COMPUTE STATISTICS [analyze_for_clause]
| ESTIMATE STATISTICS [analyze_for_clause] [SAMPLE INTNUM {ROWS | PERCENTAGE}]
analyze_for_clause:
FOR TABLE
| FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]
| FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...]
size_clause:
SIZE integer
| SIZE REPEAT
| SIZE AUTO
| SIZE SKEWONLY
column:
column_name
| (column_name [, column_name])
示例
示例一:收集用户 TEST
的表 T1
的统计信息,所有列的桶个数设定为 128
obclient> ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE 128;
示例二:收集用户 TEST
的表 T_PART1
的 GLOBAL 级别的统计信息, 只收集数据分布不均匀的列的直方图
obclient> ANALYZE TABLE T_PART1 PARTITION('T_PART1') COMPUTE STATISTICS FOR ALL COLUMNS SIZE skewonly;
示例三:收集用户 TEST
的表 T_SUBPART1
的分区 p0sp0,p1ps2
的统计信息, 所有的列的直方图都由优化器内部决定
obclient> ANALYZE TABLE T_SUBPART1 SUBPARTITION('p0sp0','p1ps2') COMPUTE STATISTICS FOR ALL COLUMNS SIZE auto;
需要注意的是上述 ANALYZE
语法在 MySQL 模式执行的时候需要打开系统变量 enable_sql_extension
,由于原生 MySQL 没有这种语法,因此需要在扩展模式执行。
示例四:在 MySQL 模式使用上述语法收集用户 TEST
的表 T1
的统计信息,所有列的桶个数设定为 128
obclient> ALTER SYSTEM SET enable_sql_extension = true;
obclient> ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE 128;
当然,目前 OceanBase 数据库优化器也兼容了原生 MySQL 的 ANALYZE
语法,具体语法如下:
analyze_stmt:
ANALYZE TABLE table_name UPDATE HISTOGRAM ON column_name_list WITH INTNUM BUCKETS
总结
除了上述常用的两个系统包的 PROCEDURE 收集统计信息以外,DMBS_STATS
系统包也提供了 GATHER_INDEX_STATS
用于收集索引统计信息、GATHER_DATABASE_STATS_JOB_PROC
来收集整个租户所有库的表的统计信息。