---
title: "手动统计信息收集 - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: 手动统计信息收集 目前 OceanBase 数据库优化器针对手动统计信息收集提供了两种方式： DBMS_STATS （推荐）、 ANALYZE 命令行；推荐使用 DBMS_STATS 系统包进行手动统计信息收集，因为 DBMS_STATS 系统包支持的功能会更加丰富。 DBMS_STATS 系统包统计信息收集 在 O…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# 手动统计信息收集

更新时间：2026-02-22 16:48:47

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/600.manage/900.performance-tuning/400.sql-tuning/200.execution-plan-optimization/100.statistics-and-cost-based-optimization/200.statistic-information/200.collect-statistic-information/200.manually-collect-statistic-information.md)  

目前 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 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004479837) 和 [DBMS_STATS 概述（Oracle 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004480180)。

```sql
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`：设置列级别的统计信息收集方式，主要采用下面的语法方式来设定：

  ```sql
  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、PARTITION 级别的统计信息。
     - `'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=>128, 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]...]

```

### 示例

**示例一：收集用户 `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 收集统计信息以外，`DBMS_STATS` 系统包也提供了 `GATHER_INDEX_STATS` 用于收集索引统计信息、`GATHER_DATABASE_STATS_JOB_PROC` 来收集整个租户所有库的表的统计信息。

## 相关文档

- [PL 语法结构（MySQL 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004476349)
 - [PL 语法结构（Oracle 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004478507)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
