ob统计信息收集

手动统计信息收集

更新时间: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 来收集整个租户所有库的表的统计信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值