文档

DBMS_STATS

更新时间:

DBMS_STATS用于收集数据库运行过程中的统计信息,提供现有统计信息的备份,支持将备份统计项进行还原。可以自定义备份统计信息的时间点,根据需求修改表的统计信息,从而辅助优化器生成期望中的执行计划。

前提条件

使用dbms_stats需要将参数polar_dbms_stats.use_locked_stats的值设置为ON。 

可以通过以下命令查看该参数的状态:

SHOW polar_dbms_stats.use_locked_stats;

可以通过以下命令设置该参数:

SET polar_dbms_stats.use_locked_stats = ON;   -- 开启
SET polar_dbms_stats.use_locked_stats = OFF;  -- 关闭

DBMS_STATS子程序总览

子程序

说明

GATHER_SCHEMA_STATS Procedure

收集和备份Schema级的统计信息。

GATHER_TABLE_STATS Procedure

收集和备份表级的统计信息。

GATHER_DATABASE_STATS Procedure

收集和备份数据库级的统计信息。

GATHER_INDEX_STATS Procedure

收集和备份索引的统计信息。

GATHER_COLUMN_STATS Procedure

收集和备份指定列的统计信息。

RESTORE_SCHEMA_STATS Procedure

还原指定Schema的统计信息。

RESTORE_DATABASE_STATS Procedure

还原数据库的统计信息。

RESTORE_TABLE_STATS Procedure

还原指定表的统计信息。

RESTORE_COLUMN_STATS Procedure

还原指定列的统计信息。

PURGE_STATS Procedure

删除指定时间点之前的统计信息备份。

SET_TABLE_STATS Procedure

设置指定表的统计信息。

GET_TABLE_STATS Procedure

获取指定表的统计信息。

SET_INDEX_STATS Procedure

设置索引的统计信息。

GET_INDEX_STATS Procedure

获取指定索引的统计信息。

GET_COLUMN_STATS Procedure

获取指定列的统计信息。

LOCK_TABLE_STATS Procedure

锁定正在使用的表统计信息。

UNLOCK_TABLE_STATS Procedure

解锁正在使用的表统计信息。

LOCK_SCHEMA_STATS Procedure

锁定正在使用的Schema的统计信息。

UNLOCK_SCHEMA_STATS Procedure

解锁正在使用的Schema的统计信息。

LOCK_COLUMN_STATS Procedure

锁定正在使用的列的统计信息。

UNLOCK_COLUMN_STATS Procedure

解锁正在使用的列的统计信息。

DELETE_TABLE_STATS Procedure

删除已有的表统计信息。

DELETE_COLUMN_STATS Procedure

删除已有的列统计信息。

DELETE_SCHEMA_STATS Procedure

删除已有的Schema对象统计信息。

DELETE_INDEX_STATS Procedure

删除已有的索引对象统计信息。

准备测试数据

测试数据仅适用本文中的操作示例。

  1. 创建Schema,名为dbms_stats_schema。

CREATE SCHEMA dbms_stats_schema;
  1. 创建表,名为dbms_stats_test。

CREATE TABLE dbms_stats_schema.dbms_stats_test(id int);
  1. 创建索引。

CREATE INDEX dbms_stats_index on dbms_stats_schema.dbms_stats_test(id);
  1. 插入数据。

INSERT INTO dbms_stats_schema.dbms_stats_test values (generate_series(1,10000));

DBMS_STATS.GATHER_SCHEMA_STATS

该函数用于收集和备份Schema级的统计信息。

语法

DBMS_STATS.GATHER_SCHEMA_STATS (
 ownname VARCHAR2
 );

参数

参数

说明

ownname

待分析的Schema名称。

示例

收集和备份Schema级的统计信息,示例如下:

CALL DBMS_STATS.GATHER_SCHEMA_STATS('dbms_stats_schema');

查询统计信息的备份情况,查询示例如下:

SELECT * FROM polar_dbms_stats.backup_history;

DBMS_STATS.GATHER_TABLE_STATS

该函数用于收集和备份表级的统计信息。

语法

DBMS_STATS.GATHER_TABLE_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2
 );

参数

参数

说明

ownname

待分析的表所属的Schema。

tabname

待分析的表名称。

示例

收集并备份表级的统计信息,示例如下:

CALL DBMS_STATS.GATHER_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');

查询统计信息备份情况,查询示例如下:

SELECT * FROM polar_dbms_stats.backup_history;

DBMS_STATS.GATHER_DATABASE_STATS

该函数用于收集和备份数据库级的统计信息。

语法

DBMS_STATS.GATHER_DATABASE_STATS ();

示例

收集并备份数据库级的统计信息,示例如下:

CALL DBMS_STATS.GATHER_DATABASE_STATS();

查询统计信息备份情况,查询示例如下:

SELECT * FROM polar_dbms_stats.backup_history;

DBMS_STATS.GATHER_INDEX_STATS

该函数用于收集和备份索引的统计信息。

语法

DBMS_STATS.GATHER_INDEX_STATS (
 ownname VARCHAR2, 
 indname VARCHAR2
 );

参数

参数

说明

ownname

待分析的索引所属的Schema。

indname

待分析的索引名称。

示例

收集并备份索引级的统计信息,示例如下:

CALL DBMS_STATS.GATHER_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index');

查询统计信息备份情况,查询示例如下:

SELECT * FROM polar_dbms_stats.backup_history;

DBMS_STATS.GATHER_COLUMN_STATS

该函数用于收集和备份指定列的统计信息。

语法

DBMS_STATS.GATHER_COLUMN_STATS (
 ownname VARCHAR2,
 tablename VARCHAR2,
 attname TEXT
 );

参数

参数

说明

ownname

待分析的列所属的Schema。

tablename

待分析的列所属的表。

attname

待分析的列名称。

示例

收集并备份指定列的统计信息,示例如下:

CALL DBMS_STATS.GATHER_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');

查询统计信息备份情况,查询示例如下:

SELECT * FROM polar_dbms_stats.backup_history;

DBMS_STATS.RESTORE_SCHEMA_STATS

该函数用于还原指定Schema的统计信息。

语法

DBMS_STATS.RESTORE_SCHEMA_STATS (
 ownname VARCHAR2, 
 as_of_timestamp TIMESTAMP WITH TIME ZONE
 );

参数

参数

说明

ownname

待还原的Schema名称。

as_of_timestamp

待还原的时间点。

示例

还原指定Schema的统计信息,示例如下:

SELECT DBMS_STATS.RESTORE_SCHEMA_STATS('dbms_stats_schema',time) FROM polar_dbms_stats.backup_history WHERE unit='s';

查询还原后的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';

DBMS_STATS.RESTORE_DATABASE_STATS

该函数用于还原数据库的统计信息。

语法

DBMS_STATS.RESTORE_DATABASE_STATS (
 as_of_timestamp TIMESTAMP WITH TIME ZONE
 );

参数

参数

说明

as_of_timestamp

待还原的时间点。

示例

还原数据库统计信息,示例如下:

SELECT DBMS_STATS.RESTORE_DATABASE_STATS(time) FROM polar_dbms_stats.backup_history WHERE unit='d';

查询还原后的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';

DBMS_STATS.RESTORE_TABLE_STATS

该函数用于还原指定表的统计信息。

语法

DBMS_STATS.RESTORE_TABLE_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2, 
 as_of_timestamp TIMESTAMP WITH TIME ZONE
 );

参数

参数

说明

ownname

待还原的表所属的Schema。

tabname

待还原的表名称。

as_of_timestamp

待还原的时间点。

示例

还原指定表统计信息,示例如下:

SELECT DBMS_STATS.RESTORE_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test', time) FROM polar_dbms_stats.backup_history WHERE unit='t';

查询还原后的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';

DBMS_STATS.RESTORE_COLUMN_STATS

该函数用于还原指定列的统计信息。

语法

DBMS_STATS.RESTORE_COLUMN_STATS (
 ownname TEXT,
 tablename TEXT,
 attname TEXT,
 as_of_timestamp timestamp with time zone
 );

参数

参数

说明

ownname

待还原的列所属的Schema。

tabname

待还原的列所属的表。

attname

待还原的列名。

as_of_timestamp

待还原的时间点。

示例

还原指定列统计信息,示例如下:

SELECT DBMS_STATS.RESTORE_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id', time) FROM polar_dbms_stats.backup_history WHERE unit='c';

查询还原后的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';

DBMS_STATS.PURGE_STATS

该函数用于删除指定时间点之前的统计信息备份。

语法

DBMS_STATS.PURGE_STATS (
 before_timestamp timestamp
 );

参数

参数

说明

before_timestamp

指定的删除时间点。

示例

删除指定时间点之前的统计信息备份,示例如下:

SELECT DBMS_STATS.PURGE_STATS(time) FROM polar_dbms_stats.backup_history WHERE unit='c';

DBMS_STATS.SET_TABLE_STATS

该函数用于设置指定表的统计信息。 

说明

在进行set_table_stats前,如果没有采集相关表的统计信息,需要先执行gather_schema_stats或者gather_table_stats。

语法

DBMS_STATS.SET_TABLE_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2, 
 numrows NUMBER DEFAULT NULL, 
 numblks NUMBER DEFAULT NULL
 );

参数

参数

说明

ownname

待设置的表所属的Schema。

tabname

待设置的表名称。

numrows

(可选参数)设置的表行数。

numblks

(可选参数)设置的表块数。

示例

设置表的统计信息,示例如下:

CALL DBMS_STATS.SET_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test', 1234, 4321);

DBMS_STATS.GET_TABLE_STATS

该函数用于获取指定表的统计信息。

语法

DBMS_STATS.GET_TABLE_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2, 
 numrows OUT NUMBER, 
 numblks OUT NUMBER
 );

参数

参数

说明

ownname

待获取的表所属的Schema。

tabname

待获取的表名称。

numrows

获取的表行数。

numblks

获取的表块数。

示例

获取表的统计信息,示例如下:

DECLARE
 numrows integer;
 numblks integer;
BEGIN
 CALL DBMS_STATS.GET_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test', numrows, numblks);
 raise notice '%', numrows;
 raise notice '%', numblks;
END;

DBMS_STATS.SET_INDEX_STATS

该函数用于设置索引的统计信息。

语法

DBMS_STATS.SET_INDEX_STATS (
 ownname VARCHAR2,
 indname VARCHAR2,
 numrows NUMBER DEFAULT NULL, 
 numblks NUMBER DEFAULT NULL
 );

参数

参数

说明

ownname

待设置的索引所属的Schema。

indname

待设置的索引名称。

numrows

(可选参数)设置的索引行数。

numblks

(可选参数)设置的索引块数。

示例

设置索引的统计信息,示例如下:

CALL DBMS_STATS.SET_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index', 2345, 5432);

DBMS_STATS.GET_INDEX_STATS

该函数用于获取指定索引的统计信息。

语法

DBMS_STATS.GET_INDEX_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2, 
 numrows OUT NUMBER, 
 numblks OUT NUMBER
 );

参数

参数

说明

ownname

待获取的索引所属的Schema。

tabname

待获取的索引名称。

numrows

获取的索引行数。

numblks

获取的索引块数。

示例

获取索引的统计信息,示例如下:

DECLARE
 numrows integer;
 numblks integer;
BEGIN
 CALL DBMS_STATS.GET_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index', numrows, numblks);
 raise notice '%', numrows;
 raise notice '%', numblks;
END;

DBMS_STATS.GET_COLUMN_STATS

该函数用于获取指定列的统计信息。

语法

DBMS_STATS.GET_COLUMN_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2, 
 colname VARCHAR2, 
 distcnt OUT NUMBER, 
 nullcnt OUT NUMBER, 
 avgclen OUT NUMBER
 );

参数

参数

说明

ownname

待获取的列所属的Schema。

tabname

待获取的列所属的表。

colname

待获取的列名称。

distcnt

获取的列中不同值的数量。

nullcnt

获取的列空值数量。

avgclen

获取的列平均长度。

示例

获取列的统计信息,示例如下:

DECLARE
 distcnt integer;
 nullcnt integer;
 avgclen integer;
BEGIN
 CALL DBMS_STATS.GET_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id', distcnt, nullcnt, avgclen);
 raise notice '%', distcnt;
 raise notice '%', nullcnt;
 raise notice '%', avgclen;
END;

DBMS_STATS.LOCK_TABLE_STATS

该函数用于锁定正在使用的表统计信息。

语法

DBMS_STATS.LOCK_TABLE_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2 
 );

参数

参数

说明

ownname

待锁定的表所属的Schema。

tabname

待锁定的表名称。

示例

锁定正在使用的表的统计信息,示例如下:

CALL DBMS_STATS.LOCK_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');

查看锁定的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname = 'dbms_stats_schema.dbms_stats_test';

DBMS_STATS.UNLOCK_TABLE_STATS

该函数用于解锁正在使用的表统计信息。

语法

DBMS_STATS.UNLOCK_TABLE_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2 
 );

参数

参数

说明

ownname

待解锁的表所属的Schema。

tabname

待解锁的表名称。

示例

解锁正在使用的表的统计信息,示例如下:

CALL DBMS_STATS.UNLOCK_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');

查看锁定的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname = 'dbms_stats_schema.dbms_stats_test';

DBMS_STATS.LOCK_SCHEMA_STATS

该函数用于锁定正在使用的Schema的统计信息。

语法

DBMS_STATS.LOCK_SCHEMA_STATS (
 ownname VARCHAR2
 );

参数

参数

说明

ownname

待锁定的Schema名称。

示例

锁定正在使用的Schema的统计信息,示例如下:

CALL DBMS_STATS.LOCK_SCHEMA_STATS('dbms_stats_schema');

查看锁定的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema.%';

DBMS_STATS.UNLOCK_SCHEMA_STATS

该函数用于解锁正在使用的Schema的统计信息。

语法

DBMS_STATS.UNLOCK_SCHEMA_STATS (
 ownname VARCHAR2
 );

参数

参数

说明

ownname

待解锁的Schema名称。

示例

解锁正在使用的Schema的统计信息,示例如下:

CALL DBMS_STATS.UNLOCK_SCHEMA_STATS('dbms_stats_schema');

查看锁定的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema.%';

DBMS_STATS.LOCK_COLUMN_STATS

该函数用于锁定正在使用的列的统计信息。

语法

DBMS_STATS.LOCK_COLUMN_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2, 
 attname VARCHAR2
 );

参数

参数

说明

ownname

待锁定的列所属的Schema。

tabname

待锁定的列所属的表。

attname

待锁定的列名称。

示例

锁定正在使用的列的统计信息,示例如下:

CALL DBMS_STATS.LOCK_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');

DBMS_STATS.UNLOCK_COLUMN_STATS

该函数用于解锁正在使用的列的统计信息。

语法

DBMS_STATS.UNLOCK_COLUMN_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2, 
 attname VARCHAR2
 );

参数

参数

说明

ownname

待解锁的列所属的Schema。

tabname

待解锁的列所属的表。

attname

待解锁的列名称。

示例

解锁正在使用的列的统计信息,示例如下:

CALL DBMS_STATS.UNLOCK_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');

DBMS_STATS.DELETE_TABLE_STATS

该函数用于删除已有的表统计信息。

语法

DBMS_STATS.DELETE_TABLE_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2
 );

参数

参数

说明

ownname

待删除的表所属的Schema。

tabname

待删除的表名称。

示例

删除已有的表统计信息,示例如下:

CALL DBMS_STATS.DELETE_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');

查看删除后的表统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_backup WHERE relname = 'dbms_stats_schema.dbms_stats_test';

DBMS_STATS.DELETE_COLUMN_STATS

该函数用于删除已有的列统计信息。

语法

DBMS_STATS.DELETE_COLUMN_STATS (
 ownname VARCHAR2, 
 tabname VARCHAR2,
 attname VARCHAR2
 );

参数

参数

说明

ownname

待删除的列所属的Schema。

tabname

待删除的列所属的表。

attname

待删除的列名称。

示例

删除已有的列统计信息,示例如下:

CALL DBMS_STATS.DELETE_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');

DBMS_STATS.DELETE_SCHEMA_STATS

该函数用于删除已有的Schema对象统计信息。

语法

DBMS_STATS.DELETE_SCHEMA_STATS (
 ownname VARCHAR2 
 );

参数

参数

说明

ownname

待删除的Schema名称。

示例

删除已有的Schema统计信息,示例如下:

CALL DBMS_STATS.DELETE_SCHEMA_STATS('dbms_stats_schema');

查询删除后的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_backup WHERE relname LIKE 'dbms_stats_schema.%';

DBMS_STATS.DELETE_INDEX_STATS

该函数用于删除已有的索引对象统计信息。

语法

DBMS_STATS.DELETE_INDEX_STATS (
 ownname VARCHAR2,
 indname VARCHAR2 
 );

参数

参数

说明

ownname

待删除的索引所属的Schema。

indname

待删除的索引名称。

示例

删除已有的索引统计信息,示例如下:

CALL DBMS_STATS.DELETE_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index');

查询删除后的统计信息,示例如下:

SELECT count(*) FROM polar_dbms_stats.relation_stats_backup WHERE relname LIKE 'dbms_stats_schema.%';
  • 本页导读 (0)
文档反馈