DBE_STATS
高级包DBE_STATS实现了一些统计信息管理的能力。包括对统计信息的锁定、解锁、回退和清除历史统计信息等。
DBE_STATS高级包不支持临时表。
接口介绍
接口名称 |
描述 |
---|---|
锁定表级统计信息。 |
|
锁定分区级统计信息。 |
|
锁定列级统计信息。 |
|
锁定指定schema下所有表相关的统计信息。 |
|
解锁表级统计信息。 |
|
解锁分区级统计信息。 |
|
解锁列级统计信息。 |
|
解锁指定schema下所有表相关的统计信息。 |
|
回退表级统计信息到指定时间点。 |
|
回退分区级统计信息到指定时间点。 |
|
回退列级统计信息到指定时间点。 |
|
回退指定schema下所有表相关的统计信息到指定时间点。 |
|
清除指定时间节点前的所有历史统计信息。 |
|
获取历史统计信息的保留时间。 |
|
获取最早可用的历史统计信息的时间。 |
|
创建用于保存统计信息的统计表。 |
|
删除用于保存统计信息的统计表。 |
|
检索指定索引的统计信息并存储在用户统计信息表中。 |
|
检索指定表的统计信息并存储在用户统计信息表中。 |
|
检索指定列的统计信息并存储在用户统计信息表中。 |
|
检索指定schema的统计信息并存储在用户统计信息表中。 |
|
从用户统计信息表中检索指定索引的统计信息,并将其写回系统表。 |
|
从用户统计信息表中检索指定表的统计信息,并将其写回系统表。 |
|
从用户统计信息表中检索指定列的统计信息,并将其写回系统表。 |
|
从用户统计信息表中检索指定schema的统计信息,并将其写回系统表。 |
|
设置列相关的统计信息,包括单列、多列、表达式统计信息。 |
|
设置索引相关的统计信息。 |
|
设置表相关的统计信息。 |
|
删除列相关的统计信息,包括单列、多列、表达式统计信息。 |
|
删除索引相关的统计信息。 |
|
删除表相关的统计信息。 |
|
删除schema下所有表、索引、列相关的统计信息。 |
- DBE_STATS.LOCK_TABLE_STATS
锁定一个表的统计信息,锁定后,该表的统计信息无法更新,该表下级涉及的索引、分区和列会同步被锁定。该接口无返回值。
DBE_STATS.LOCK_TABLE_STATS的函数原型:
DBE_STATS.LOCK_TABLE_STATS( ownname VARCHAR2, tabname VARCHAR2 );
表2 DBE_STATS.LOCK_TABLE_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
要锁定的表所属的schema名称,该参数为空时,默认为当前schema。
tabname
varchar2
否
要锁定的表的名称。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 可查看该表的reloptions中stat_state状态获取该表的锁定状态。
- 当一个表处于锁定状态时,其统计信息无法更新。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表 gaussdb=# CREATE SCHEMA dbe_stats_lock; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=dbe_stats_lock; SET gaussdb=# CREATE TABLE t1(a int,b int); CREATE TABLE -- 锁定表,查看其锁定状态 gaussdb=# CALL DBE_STATS.LOCK_TABLE_STATS(ownname=>'dbe_stats_lock',tabname=>'t1'); lock_table_stats ------------------ (1 row) gaussdb=# SELECT relname,instr(reloptions::text,'stat_state=locked',1,1) <> 0 as exist_lock FROM PG_CLASS WHERE relname='t1' and relnamespace = (SELECT oid FROM PG_NAMESPACE WHERE nspname='dbe_stats_lock'); relname | exist_lock ---------+------------ t1 | t (1 row) -- 锁定后analyze, 发生报错 gaussdb=# ANALYZE t1; ERROR: The statistics is locked, cannot be updated. -- 删除表、删除命名空间 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_lock; DROP SCHEMA
- DBE_STATS.LOCK_PARTITION_STATS
锁定一个分区的统计信息,锁定后,该分区的统计信息无法更新,该分区涉及下级的索引、分区、列会同步锁定。该接口无返回值。
DBE_STATS.LOCK_PARTITION_STATS的函数原型:
DBE_STATS.LOCK_PARTITION_STATS( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2 );
表3 DBE_STATS.LOCK_PARTITION_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
要锁定的分区所属的schema的名称,该参数为空时,默认为当前schema。
tabname
varchar2
否
要锁定的分区所属的表的名称。
partname
varchar2
否
要锁定的分区的名称。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 可查看该分区的reloptions中stat_state状态获取该表的锁定状态。
- 当该分区或该表所属的表处于锁定状态时,其统计信息无法更新。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表 gaussdb=# CREATE SCHEMA dbe_stats_lock; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=dbe_stats_lock; SET gaussdb=# CREATE TABLE upart_table(a int, b int, c int) PARTITION BY RANGE(a) ( PARTITION p1 VALUES LESS THAN(1200), PARTITION p2 VALUES LESS THAN(2400), PARTITION p3 VALUES LESS THAN(MAXVALUE) ); CREATE TABLE -- 锁定一个分区,其他分区及表不受影响 gaussdb=# CALL DBE_STATS.LOCK_PARTITION_STATS(ownname=>'dbe_stats_lock',tabname=>'upart_table',partname=>'p1'); lock_partition_stats ---------------------- (1 row) gaussdb=# SELECT relname,instr(reloptions::text,'stat_state=locked',1,1) <> 0 as exist_lock FROM PG_CLASS WHERE relname='upart_table'; relname | exist_lock -------------+------------ upart_table | f (1 row) gaussdb=# SELECT relname,instr(reloptions::text,'stat_state=locked',1,1) <> 0 as exist_lock FROM PG_PARTITION WHERE parentid='upart_table'::REGCLASS; relname | exist_lock -------------+------------ upart_table | f p2 | f p3 | f p1 | t (4 rows) -- 删除表、命名空间 gaussdb=# DROP TABLE upart_table; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_lock; DROP SCHEMA
- DBE_STATS.LOCK_COLUMN_STATS
锁定一个列的统计信息,锁定后,该列的统计信息无法更新。该接口无返回值。
DBE_STATS.LOCK_COLUMN_STATS的函数原型:
DBE_STATS.LOCK_COLUMN_STATS( ownname VARCHAR2, tabname VARCHAR2, colname VARCHAR2, partname VARCHAR2 DEFAULT NULL );
表4 DBE_STATS.LOCK_COLUMN_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
要锁定的列所属的schema的名称,该参数为空时,默认为当前schema。
tabname
varchar2
否
要锁定的列所属的表的名称。
colname
varchar2
否
要锁定的列的名称。
partname
varchar2
是
要锁定的列所属的分区的名称,默认为空。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 当partname为空时,默认锁定该列表级统计信息。
- 若不存在该表的列级统计信息,则锁定可执行成功,但实际未生效。
- 可查看PG_STATISTIC/PG_STATISTIC_EXT中的stastate获取锁定状态。
- 锁定多列时,需先查询PG_STATISTIC_EXT中的staextname字段获取多列别名作为colname入参传入。
- 当某一列被锁定或其所属的表或分区被锁定时,其统计信息无法更新,但该列被锁定的信息不会回显,需自行在日志里通过DEBUG2级别的DBE_STATS的logging_module查看。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表,收集统计信息 gaussdb=# CREATE SCHEMA dbe_stats_lock; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=dbe_stats_lock; SET gaussdb=# CREATE TABLE t1(a int,b int); CREATE TABLE gaussdb=# INSERT INTO t1 VALUES(generate_series(1,100),1); INSERT 0 100 gaussdb=# ANALYZE t1; ANALYZE -- 锁定列后,查看列的锁定状态 gaussdb=# CALL DBE_STATS.LOCK_COLUMN_STATS(ownname=>'dbe_stats_lock',tabname=>'t1',colname=>'a'); lock_column_stats ------------------- (1 row) gaussdb=# SELECT staattnum,stastate FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stastate -----------+---------- 2 | u 1 | l (2 rows) -- 删除表、命名空间 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_lock; DROP SCHEMA
- DBE_STATS.LOCK_SCHEMA_STATS
锁定一个指定schema下所有表的统计信息。该接口无返回值。
DBE_STATS.LOCK_SCHEMA_STATS的函数原型:
DBE_STATS.LOCK_SCHEMA_STATS( ownname VARCHAR2 );
表5 DBE_STATS.LOCK_SCHEMA_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
指定的schema名,该参数为空时,默认为当前schema。
- 调用该接口时,会锁定该schema下所有当前用户有ANALYZE权限的表,对于没有权限的表直接跳过。
- 调用该接口需拥有指定schema的USAGE权限。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 锁定schema的统计信息同锁定表的统计信息用法一致,此处仅展示接口调用方式,具体示例可参考DBE_STATS.LOCK_TABLE_STA...示例 gaussdb=# CALL DBE_STATS.LOCK_SCHEMA_STATS(ownname=>'dbe_stats_lock'); lock_schema_stats ------------------- (1 row)
- DBE_STATS.UNLOCK_TABLE_STATS
解锁一个表的统计信息,解锁后,该表的统计信息可以更新。该表下级涉及的索引、分区、列会同步解锁。该接口无返回值。
DBE_STATS.UNLOCK_TABLE_STATS的函数原型:
DBE_STATS.UNLOCK_TABLE_STATS( ownname VARCHAR2, tabname VARCHAR2 );
表6 DBE_STATS.UNLOCK_TABLE_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
要解锁的表所属的schema的名称,该参数为空时,默认为当前schema。
tabname
varchar2
否
要解锁的表的名称。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 可查看该表的reloptions中stat_state状态获取该表的锁定状态。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 解锁表的统计信息同锁定表的统计信息用法一致,此处仅展示接口调用方式,具体示例可参DBE_STATS.LOCK_TABLE_STA...示例 gaussdb=# CALL DBE_STATS.UNLOCK_TABLE_STATS(ownname=>'dbe_stats_lock',tabname=>'t1'); unlock_table_stats -------------------- (1 row)
- DBE_STATS.UNLOCK_PARTITION_STATS
解锁一个分区的统计信息,解锁后,该分区的统计信息可以更新。该分区下级涉及的索引、分区、列会同步解锁。该接口无返回值。
DBE_STATS.UNLOCK_PARTITION_STATS的函数原型:
DBE_STATS.UNLOCK_PARTITION_STATS( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2 );
表7 DBE_STATS.UNLOCK_PARTITION_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
要解锁的分区所属的schema的名称,该参数为空时,默认为当前schema。
tabname
varchar2
否
要解锁的分区所属的表的名称。
partname
varchar2
否
要解锁的分区的名称。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 可查看该分区的reloptions中stat_state状态获取该表的锁定状态。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 解锁分区的统计信息同锁定分区的统计信息用法一致,此处仅展示接口调用方式,具体示例可参DBE_STATS.LOCK_PARTIION_...示例 gaussdb=# CALL DBE_STATS.UNLOCK_PARTITION_STATS(ownname=>'dbe_stats_lock',tabname=>'upart_table',partname=>'p1'); unlock_partition_stats ------------------------ (1 row)
- DBE_STATS.UNLOCK_COLUMN_STATS
解锁一个列的统计信息,解锁后,该列的统计信息可以更新。该接口无返回值。
DBE_STATS.UNLOCK_COLUMN_STATS的函数原型:
DBE_STATS.LOCK_COLUMN_STATS( ownname VARCHAR2, tabname VARCHAR2, colname VARCHAR2, partname VARCHAR2 DEFAULT NULL );
表8 DBE_STATS.UNLOCK_COLUMN_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
要解锁的列所属的schema的名称,该参数为空时,默认为当前schema。
tabname
varchar2
否
要解锁的列所属的表的名称。
colname
varchar2
否
要解锁的列的名称。
partname
varchar2
是
要解锁的列所属的分区的名称,默认为空。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 当partname为空时,默认解锁该列表级统计信息,以及解锁其级联分区列级统计信息。
- 可查看PG_STATISTIC/PG_STATISTIC_EXT中的stastate状态未获取锁定状态。
- 解锁多列时,需先查询PG_STATISTIC_EXT中的staextname字段获取多列别名作为colname入参传入。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 解锁列的统计信息同锁定列的统计信息用法一致,此处仅展示接口调用方式,具体示例可参考DBE_STATS.LOCK_COLUMN_ST...示例 gaussdb=# CALL DBE_STATS.UNLOCK_COLUMN_STATS(ownname=>'dbe_stats_lock',tabname=>'t1',colname=>'a'); unlock_column_stats --------------------- (1 row)
- DBE_STATS.UNLOCK_SCHEMA_STATS
锁定一个指定schema下所有表的统计信息。该接口无返回值。
DBE_STATS.UNLOCK_SCHEMA_STATS的函数原型:
DBE_STATS.UNLOCK_SCHEMA_STATS( ownname VARCHAR2 );
表9 DBE_STATS.UNLOCK_SCHEMA_STATS的接口说明 参数
类型
是否允许为空
描述
ownname
varchar2
是
指定的schema名,该参数为空时,默认为当前schema。
- 调用该接口时,会解锁该schema下所有当前用户有ANALYZE权限的表,对于没有权限的表直接跳过。
- 调用该接口需拥有指定schema的USAGE权限。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 解锁schema的统计信息同解锁表的统计信息用法一致,此处仅展示接口调用方式,具体示例可参考DBE_STATS.LOCK_TABLE_STA...示例 gaussdb=# CALL DBE_STATS.UNLOCK_SCHEMA_STATS(ownname=>'dbe_stats_lock'); unlock_schema_stats --------------------- (1 row)
- DBE_STATS.RESTORE_TABLE_STATS
将表的统计信息回退到指定的时间节点,选择该时间节点前最后一次收集的统计信息载入系统表,同时级联其下级未被锁定的分区、索引、列级统计信息。该接口无返回值。
DBE_STATS.RESTORE_TABLE_STATS的函数原型:
DBE_STATS.RESTORE_TABLE_STATS( ownname VARCHAR2, tabname VARCHAR2, as_of_timestamp TIMESTAMPTZ, restore_cluster_index BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE, no_invalidate BOOLEAN DEFAULT NULL );
表10 DBE_STATS.RESTORE_TABLE_STATS的接口介绍 参数
类型
是否允许为空
描述
ownname
VARCHAR2
是
要回退的表所属的schema名,该参数为空时,默认为当前schema。
tabname
VARCHAR2
否
要回退的表的表名。
as_of_timestamp
timestamp with time zone
否
要回退的目标时间节点。
restore_cluster_index
BOOLEAN
是
暂不支持。
force
BOOLEAN
是
是否在统计信息被锁定时强行回退的标志位,默认为FALSE。
no_invalidate
BOOLEAN
是
暂不支持。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 调用该接口时,同时回退其下级分区、索引、列的统计信息,如果其下级的分区或列被锁定,则直接跳过。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表,收集两次统计信息 gaussdb=# CREATE SCHEMA dbe_stats_restore; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=dbe_stats_restore; SET gaussdb=# CREATE TABLE t1(a int, b int); CREATE TABLE gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE -- 查看历史表 gaussdb=# SELECT relname,reltuples FROM GS_TABLESTATS_HISTORY WHERE relname='t1'; relname | reltuples ---------+----------- t1 | 3 t1 | 6 (2 rows) -- 查看当前系统表中的统计信息 gaussdb=# SELECT relname,reltuples FROM PG_CLASS WHERE relname='t1' AND relnamespace = (SELECT oid FROM PG_NAMESPACE WHERE nspname='dbe_stats_restore'); relname | reltuples ---------+----------- t1 | 6 (1 row) -- 回退到最早的统计信息,查看系统表 gaussdb=# CALL DBE_STATS.RESTORE_TABLE_STATS(ownname=>'dbe_stats_restore',tabname=>'t1',as_of_timestamp=>((SELECT MIN(reltimestamp) FROM GS_TABLESTATS_HISTORY WHERE relname='t1') + INTERVAL '1 second')); restore_table_stats --------------------- (1 row) gaussdb=# SELECT relname,reltuples FROM PG_CLASS WHERE relname='t1' AND relnamespace = (SELECT oid FROM PG_NAMESPACE WHERE nspname='dbe_stats_restore'); relname | reltuples ---------+----------- t1 | 3 (1 row) -- 删除表、删除命名空间 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_restore; DROP SCHEMA
- DBE_STATS.RESTORE_PARTITION_STATS
将分区的统计信息回退到指定的时间节点,选择该时间节点前最后一次收集的统计信息载入系统表,同时级联其下级未被锁定的分区、索引、列级统计信息。该接口无返回值。
DBE_STATS.RESTORE_PARTITION_STATS的函数原型:
DBE_STATS.RESTORE_PARTITION_STATS( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2, as_of_timestamp TIMESTAMPTZ, force BOOLEAN DEFAULT FALSE, no_invalidate BOOLEAN DEFAULT NULL );
表11 DBE_STATS.RESTORE_PARTITION_STATS的接口介绍 参数
类型
是否允许为空
描述
ownname
VARCHAR2
是
要回退的分区所属的schema名。
tabname
VARCHAR2
否
要回退的分区所属的表名。
partname
VARCHAR2
否
要回退的分区名。
as_of_timestamp
timestamp with time zone
否
要回退的目标时间节点。
force
BOOLEAN
是
是否在统计信息被锁定时强行回退的标志位。
no_invalidate
BOOLEAN
是
暂不支持。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 调用该接口时,同时回退其下级分区、索引、列的统计信息。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 回退分区的统计信息同回退表的统计信息用法一致,此处仅展示接口调用方式,具体示例请参见•DBE_STATS.RESTORE_TABLE...示例 gaussdb=# CALL DBE_STATS.RESTORE_PARTITION_STATS(ownname=>'dbe_stats_restore',tabname=>'t1',partname=>'p1',as_of_timestamp=>((SELECT MIN(reltimestamp) FROM GS_TABLESTATS_HISTORY WHERE relname='t1') + INTERVAL '1 second')); restore_partition_stats ------------------------- (1 row)
- DBE_STATS.RESTORE_COLUMN_STATS
将列的统计信息回退到指定的时间节点,选择该时间节点前最后一次收集的统计信息载入系统表。该接口无返回值。
DBE_STATS.RESTORE_COLUMN_STATS的函数原型:
RESTORE_COLUMN_STATS( ownname VARCHAR2, tabname VARCHAR2, colname VARCHAR2, partname VARCHAR2 DEFAULT NULL, as_of_timestamp TIMESTAMPTZ, force BOOLEAN DEFAULT FALSE, no_invalidate BOOLEAN DEFAULT NULL );
表12 DBE_STATS.RESTORE_COLUMN_STATS的接口介绍 参数
类型
是否允许为空
描述
ownname
VARCHAR2
是
要回退的列所属的schema名。
tabname
VARCHAR2
否
要回退的列所属的表名。
colname
VARCHAR2
否
要回退的列名。
partname
VARCHAR2
是
要回退的列所属的分区名。
as_of_timestamp
timestamp with time zone
否
要回退的目标时间节点。
force
BOOLEAN
是
是否在统计信息被锁定时强行回退的标志位。
no_invalidate
BOOLEAN
是
暂不支持。
- 使用该接口时,用户必须对指定的表拥有与ANALYZE命令相同的权限,可以参考ANALYZE | ANALYSE。
- 当partname为空时,默认回退该列表及统计信息。
- 回退多列时,需先查询PG_STATISTIC_EXT中的staextname字段获取多列别名作为colname入参传入。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表,收集两次统计信息 gaussdb=# CREATE SCHEMA dbe_stats_restore; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=dbe_stats_restore; SET gaussdb=# CREATE TABLE t1(a int, b int); CREATE TABLE gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE -- 查看历史表里的统计信息 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM GS_STATISTIC_HISTORY WHERE starelid='t1'::REGCLASS ORDER BY statimestamp; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+-------------+------------ 1 | -.333333 | 1 | {1} | {1} 2 | -.333333 | 1 | {1} | {1} 1 | -.333333 | 1 | {.5,.5} | {1,2} 2 | -.333333 | 1 | {.5,.5} | {1,2} (4 rows) -- 查询当前系统表中的统计信息 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+-------------+------------ 1 | -.333333 | 1 | {.5,.5} | {1,2} 2 | -.333333 | 1 | {.5,.5} | {1,2} (2 rows) -- 回退到时间较早的时间节点,查询系统表中的统计信息 gaussdb=# CALL DBE_STATS.RESTORE_COLUMN_STATS(ownname=>'dbe_stats_restore',tabname=>'t1',colname=>'a',as_of_timestamp=>((SELECT MIN(reltimestamp) FROM GS_TABLESTATS_HISTORY WHERE relname='t1') + INTERVAL '1 second')); restore_column_stats ---------------------- (1 row) gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+-------------+------------ 1 | -.333333 | 1 | {1} | {1} 2 | -.333333 | 1 | {.5,.5} | {1,2} (2 rows) -- 删除表、命名空间 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_restore; DROP SCHEMA
- DBE_STATS.RESTORE_SCHEMA_STATS
将指定schema下所有表的统计信息回退到指定时间节点。该接口无返回值。
DBE_STATS.RESTORE_SCHEMA_STATS的函数原型:
DBE_STATS.RESTORE_SCHEMA_STATS( ownname VARCHAR2, as_of_timestamp TIMESTAMPTZ, force BOOLEAN DEFAULT FALSE, no_invalidate BOOLEAN DEFAULT NULL );
表13 DBE_STATS.RESTORE_SCHEMA_STATS的接口介绍 参数
类型
是否允许为空
描述
ownname
VARCHAR2
是
指定的schema名。
as_of_timestamp
timestamp with time zone
否
要回退的目标时间节点。
force
BOOLEAN
是
是否在统计信息被锁定时强行回退的标志位。
no_invalidate
BOOLEAN
是
暂不支持。
- 调用该接口时,会回退该schema下所有当前用户有ANALYZE权限的表,对于没有权限的表直接跳过。
- 调用该接口需拥有指定schema的USAGE权限。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 回退schema的统计信息同回退表的统计信息用法一致 -- 建表,插数据,收集两次统计信息 gaussdb=#CREATE SCHEMA dbe_stats_restore; CREATE SCHEMA gaussdb=#SET CURRENT_SCHEMA=dbe_stats_restore; SET gaussdb=#CREATE TABLE t1(a int, b int); CREATE TABLE gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=#INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=#INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=#ANALYZE t1; ANALYZE gaussdb=#INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=#INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=#INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=#ANALYZE t1; ANALYZE -- 查看系统表 gaussdb=#SELECT relname,reltuples FROM GS_TABLESTATS_HISTORY WHERE relname='t1'; relname | reltuples ---------+----------- t1 | 3 t1 | 6 (2 rows gaussdb=#SELECT relname,reltuples FROM PG_CLASS WHERE relname='t1' AND relnamespace = (SELECT oid FROM PG_NAMESPACE WHERE nspname='dbe_stats_restore'); relname | reltuples ---------+----------- t1 | 6 (1 row) -- 回退 gaussdb=#CALL DBE_STATS.RESTORE_SCHEMA_STATS(ownname=>'dbe_stats_restore',as_of_timestamp=>((SELECT MIN(reltimestamp) FROM GS_TABLESTATS_HISTORY WHERE relname='t1') + INTERVAL '1 second')); restore_schema_stats ---------------------- (1 row) -- 再次查看系统表 gaussdb=#SELECT relname,reltuples FROM PG_CLASS WHERE relname='t1' AND relnamespace = (SELECT oid FROM PG_NAMESPACE WHERE nspname='dbe_stats_restore'); relname | reltuples ---------+----------- t1 | 3 (1 row) -- 删除表、命名空间 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_restore; DROP SCHEMA
- DBE_STATS.PURGE_STATS
DBE_STATS.PURGE_STATS的函数原型:
DBE_STATS.PURGE_STATS( before_timestamp TIMESTAMPTZ );
表14 DBE_STATS.PURGE_STATS的接口介绍 参数
类型
是否允许为空
描述
before_timestamp
timestamp with time zone
否
指定要清除的时间节点。
只有初始用户可调用该接口。
示例:
-- 建表,收集两次统计信息 gaussdb=# CREATE SCHEMA dbe_stats_purge; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=dbe_stats_purge; SET gaussdb=# CREATE TABLE t1(a int, b int); CREATE TABLE gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(1,1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES(2,2); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE -- 查看历史表 gaussdb=# SELECT relname,reltuples FROM GS_TABLESTATS_HISTORY WHERE relname='t1'; relname | reltuples ---------+----------- t1 | 3 t1 | 6 (2 rows) -- 清除时间较早的历史统计信息,查看历史表 gaussdb=# CALL DBE_STATS.PURGE_STATS(before_timestamp=>((SELECT MIN(reltimestamp) FROM GS_TABLESTATS_HISTORY WHERE relname='t1') + INTERVAL '1 second')); purge_stats ------------- (1 row) gaussdb=# SELECT relname,reltuples FROM GS_TABLESTATS_HISTORY WHERE relname='t1'; relname | reltuples ---------+----------- t1 | 6 (1 row) -- 删除表、命名空间 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_purge; DROP SCHEMA
- DBE_STATS.GET_STATS_HISTORY_RETENTION
获得当前历史统计信息的保留时间,返回用DBE_STATS.ALTER_STATS_HISTORY_RETENTION接口设置的保留时间。该接口没有入参。
DBE_STATS.GET_STATS_HISTORY_RETENTION的函数原型:
DBE_STATS.GET_STATS_HISTORY_RETENTION() returns NUMBER;
示例:
gaussdb=# CALL DBE_STATS.GET_STATS_HISTORY_RETENTION(); get_stats_history_retention ----------------------------- 31 (1 row)
- DBE_STATS.GET_STATS_HISTORY_AVAILABILITY
获得当前历史统计信息的最早可用时间,返回当前数据库下所有历史统计信息的最早时间。该接口没有入参。
DBE_STATS.GET_STATS_HISTORY_AVAILABILITY的函数原型:
DBE_STATS.GET_STATS_HISTORY_AVAILABILITY() returns TIMESTAMPTZ;
示例:
gaussdb=# ANALYZE; ANALYZE gaussdb=# CALL DBE_STATS.GET_STATS_HISTORY_AVAILABILITY(); get_stats_history_availability -------------------------------- 2023-08-27 02:07:04.065217+08 (1 row)
以上所有接口函数原型都具备同等数据类型和字段的C_FUNCTION函数原型,命名为DBE_STATS.XXXX_C_FUNCTION。
DBE_STATS高级包接口仅对普通表有效。
- DBE_STATS.CREATE_STAT_TABLE
DBE_STATS.CREATE_STAT_TABLE函数原型为:
DBE_STATS.CREATE_STAT_TABLE ( ownname VARCHAR2, stattab VARCHAR2, tblspace VARCHAR2 DEFAULT NULL, global_temporary BOOLEAN DEFAULT NULL );
表15 DBE_STATS.CREATE_STAT_TABLE接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定创建的统计表所在的schema。如果设置为null,默认在当前所在的schema创建。
stattab
VARCHAR2
否
统计表的名称。
tblspace
VARCHAR2
是
指定创建的统计表所在的表空间。如果不指定,则使用默认表空间进行创建。
global_temporary
BOOLEAN
是
暂不支持该参数。
- 要调用此过程创建统计表,需要用户拥有在指定schema与指定tablespace下创建表和创建索引的权限。
- 为了区分普通表和统计表,在创建统计表后,其reloptions中的字段statstable将不为空串。且考虑到统计表结构后续存在升级的可能,为了实现前向兼容,statstable将被赋予当前统计信息表的版本信息。
- 该表创建时会自动生成一个索引gs_stattab_oid_statid_type_nameinfo_index用于索引扫描,其中oid为该统计信息表的oid。如若被删除,则导入导出export、import接口不可用。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
--在dbe_stats_create_drop_schema下创建一个stattab统计表,并手动插入一条数据,可从新建的用户统计信息表中查询到此条数据。 gaussdb=# CREATE SCHEMA dbe_stats_create_drop_schema; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_create_drop_schema; SET gaussdb=# CALL DBE_STATS.CREATE_STAT_TABLE(ownname => 'dbe_stats_create_drop_schema', stattab => 'stat_tab'); create_stat_table ------------------- (1 row) gaussdb=# INSERT INTO stat_tab(statid, type, relname) VALUES('123', 't', 't1'); INSERT 0 1 gaussdb=# SELECT statid, type, relname FROM stat_tab; statid | type | relname --------+------+--------- 123 | t | t1 (1 row)
- DBE_STATS.DROP_STAT_TABLE
DBE_STATS.DROP_STAT_TABLE函数原型为:
DBE_STATS.DROP_STAT_TABLE ( ownname VARCHAR2, stattab VARCHAR2 );
表16 DBE_STATS.DROP_STAT_TABLE接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
统计表所在的schema。如果设置为null,则默认使用当前schema。
stattab
VARCHAR2
否
统计表的名称。
- 要调用此过程删除统计表,需要用户拥有在指定schema下删除表和删除索引的权限。
- 对于statstable属性为空的普通表,无法使用此过程删除。
- 如果在用户统计信息表上创建了索引或者创建了其他依赖于该表的对象,那么在调用此过程时,会级联删除所有依赖于该表的对象。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 删除用户统计信息表。将上述所建的用户统计信息表删除,删除新建的schema。 gaussdb=# CALL DBE_STATS.DROP_STAT_TABLE(ownname => 'dbe_stats_create_drop_schema', stattab => 'stat_tab'); drop_stat_table ----------------- (1 row) gaussdb=# DROP SCHEMA dbe_stats_create_drop_schema CASCADE; DROP SCHEMA
- DBE_STATS.EXPORT_INDEX_STATS
在系统表中根据查找指定索引的统计信息,并将结果存储在用户统计信息表中。该接口无返回值。
DBE_STATS.EXPORT_INDEX_STATS的函数原型为:
DBE_STATS.EXPORT_INDEX_STATS ( ownname VARCHAR2, indname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, statown VARCHAR2 DEFAULT NULL );
表17 DBE_STATS.EXPORT_INDEX_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定索引所在schema的名称,如果设置为null,会默认使用当前的schema。
indname
VARCHAR2
否
指定需要导出统计信息的索引名。
partname
VARCHAR2
是
分区索引的名称。如果索引已分区但是partname为null,则导出全局和分区索引统计信息。
stattab
VARCHAR2
否
指定存储统计信息用户表的表名。
statid
VARCHAR2
是
指向stattab中统计信息的标识符(可选)。
statown
VARCHAR2
是
暂不支持。
- 要调用此过程导出索引统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。。
- 调用此过程将统计信息导出到用户统计信息表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导出索引的reltuples(numrows)、relpages(numlblks)和relallvisible(relallvisible)三类统计信息。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表,收集统计信息。 gaussdb=# CREATE SCHEMA dbe_stats_export; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_export; SET gaussdb=# CREATE TABLE t2(a int, b int, c int) PARTITION BY RANGE(a) SUBPARTITION BY RANGE(b) ( PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION s1 VALUES LESS THAN (500), SUBPARTITION s2 VALUES LESS THAN (MAXVALUE) ), PARTITION p2 VALUES LESS THAN(500) (SUBPARTITION s3 VALUES LESS THAN (500), SUBPARTITION s4 VALUES LESS THAN (MAXVALUE) ), PARTITION p3 VALUES LESS THAN(MAXVALUE) ( SUBPARTITION s5 VALUES LESS THAN (500), SUBPARTITION s6 VALUES LESS THAN (MAXVALUE) ) ); CREATE TABLE gaussdb=# CREATE INDEX idx_t2_local_a ON t2(a) LOCAL ( PARTITION p1_idx_a ( SUBPARTITION s1_idx_a, SUBPARTITION s2_idx_a ), PARTITION p2_idx_a ( SUBPARTITION s3_idx_a, SUBPARTITION s4_idx_a ), PARTITION p3_idx_a ( SUBPARTITION s5_idx_a, SUBPARTITION s6_idx_a )); CREATE INDEX gaussdb=# INSERT INTO t2 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (100, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 400, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 600, 1); INSERT 0 1 gaussdb=# ANALYZE t2; ANALYZE gaussdb=# ANALYZE t2((a,b)); ANALYZE -- 建立用户统计信息表,作为统计信息导出的目标表。 gaussdb=# CALL DBE_STATS.CREATE_STAT_TABLE('dbe_stats_export', 'export_table'); create_stat_table ------------------- (1 row) -- 导出索引统计信息,连同分区索引的统计信息一并导出。 -- 查看当前的统计信息。 gaussdb=# SELECT relpages,reltuples FROM PG_CLASS WHERE relname='idx_t2_local_a'; relpages | reltuples ----------+----------- 6 | 6 (1 row) gaussdb=# SELECT relname,relpages,reltuples FROM PG_PARTITION WHERE parentid='idx_t2_local_a'::REGCLASS; relname | relpages | reltuples ----------+----------+----------- s1_idx_a | 1 | 0 s2_idx_a | 1 | 0 s3_idx_a | 1 | 0 s4_idx_a | 1 | 0 s5_idx_a | 1 | 0 s6_idx_a | 1 | 0 (6 rows) -- 导出统计信息,查看用户统计信息表中的数据。 gaussdb=# CALL DBE_STATS.EXPORT_INDEX_STATS(ownname => 'dbe_stats_export', indname => 'idx_t2_local_a', partname=> null, stattab => 'export_table', statid => 'idx_s1'); export_index_stats -------------------- (1 row) gaussdb=# SELECT relname,partname,numrows,numblocks FROM export_table; relname | partname | numrows | numblocks ----------------+----------+---------+----------- idx_t2_local_a | | 6 | 6 idx_t2_local_a | s6_idx_a | 0 | 1 idx_t2_local_a | s5_idx_a | 0 | 1 idx_t2_local_a | s4_idx_a | 0 | 1 idx_t2_local_a | s3_idx_a | 0 | 1 idx_t2_local_a | s2_idx_a | 0 | 1 idx_t2_local_a | s1_idx_a | 0 | 1 (7 rows) -- 删除表、命名空间。 gaussdb=# DROP INDEX idx_t2_local_a; DROP INDEX gaussdb=# DROP TABLE t2; DROP TABLE gaussdb=# DROP TABLE export_table; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_export; DROP SCHEMA
- DBE_STATS.EXPORT_TABLE_STATS
检索指定表的统计信息,并存储在用户统计信息表中。该接口无返回值。
DBE_STATS.EXPORT_TABLE_STATS的函数原型:
DBE_STATS.EXPORT_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, cascade BOOLEAN DEFAULT TRUE, statown VARCHAR2 DEFAULT NULL, stat_category VARCHAR2 DEFAULT NULL );
表18 DBE_STATS.EXPORT_TABLE_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定schema的名称,如果设置为null,会默认使用当前的schema。
tabname
VARCHAR2
否
指定需要导出统计信息的表名。
partname
VARCHAR2
是
表分区的名称。如果表已分区但是partname为null,则导出全局和分区表统计信息。
stattab
VARCHAR2
否
指定存储统计信息用户表的表名。
statid
VARCHAR2
是
指向stattab中统计信息的标识符(可选)。
cascade
BOOLEAN
是
是否一并导出列、索引、多列和索引表达式的统计信息。默认为TRUE。
statown
VARCHAR2
是
暂不支持。
stat_category
VARCHAR2
是
暂不支持。
- 要调用此过程导出表统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 调用此过程将统计信息导出到用户统计信息表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导出表的reltuples(numrows)、relpages(numblks)和relallvisible(relallvisible)三类统计信息。级联导出列级、索引级的统计信息参考EXPORT_INDEX_STATS和EXPORT_COLUMN_STATS接口的统计信息。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 导出表的统计信息同导出索引统计信息用法一致,此处仅展示接口调用方式,具体示例可参考DBE_STATS.EXPORT_INDEX_STATS示例。 gaussdb=# CALL DBE_STATS.EXPORT_TABLE_STATS(ownname => 'dbe_stats_export', tabname => 't2', partname =>null, stattab => 'export_table', statid => 't1_t', cascade => true); export_table_stats -------------------- (1 row)
- DBE_STATS.EXPORT_COLUMN_STATS
检索指定列(多列/表达式)的统计信息并存储在用户统计信息表中。该接口无返回值。
DBE_STATS.EXPORT_COLUMN_STATS的函数原型为:
DBE_STATS.EXPORT_COLUMN_STATS ( ownname VARCHAR2, tabname VARCHAR2, colname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, statown VARCHAR2 DEFAULT NULL );
表19 DBE_STATS.EXPORT_COLUMN_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定schema的名称,如果设置为null,会默认使用当前的schema。
tabname
VARCHAR2
否
指定需要导出统计信息的列所属的表名(表达式对应索引名)。
colname
VARCHAR2
否
列名或者多列名(tabname为索引时,colname为表达式名)。
partname
VARCHAR2
是
分区的名称。如果表/索引已分区但是partname为null,则导出全局和分区列/多列/索引表达式统计信息。
stattab
VARCHAR2
否
指定存储统计信息用户表的表名。
statid
VARCHAR2
是
指向stattab中统计信息的标识符(可选)。
statown
VARCHAR2
是
暂不支持。
- 要调用此过程导出表统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 调用此过程将统计信息导出到用户统计信息表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导出列级的统计信息可查询PG_STATISTIC或者PG_STATISTIC_EXT。
- 导出多列统计信息时,需先查询PG_STATISTIC_EXT中的staextname字段获取多列别名作为colname入参传入。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
--建表,收集统计信息。 gaussdb=# CREATE SCHEMA dbe_stats_export; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA=dbe_stats_export; SET gaussdb=# CREATE TABLE IF NOT EXISTS t1 (a int, b int, c int); CREATE TABLE gaussdb=# CREATE INDEX idx_t1_expr on t1((a*a), (a+a), (a*b)); CREATE INDEX gaussdb=# INSERT INTO t1 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (150, 550, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (250, 150, 1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE gaussdb=# ANALYZE t1((a,b)); ANALYZE --建立用户统计信息表。 gaussdb=# CALL DBE_STATS.CREATE_STAT_TABLE('dbe_stats_export', 'export_table'); create_stat_table ------------------- (1 row) --查看列级统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+-------------+--------------- 1 | -1 | 2 | | {100,150,250} 2 | -1 | 2 | | {150,300,550} 3 | -.333333 | 1 | {1} | {1} (3 rows) --导出列级统计信息,查看用户统计信息表。 gaussdb=# CALL DBE_STATS.EXPORT_COLUMN_STATS(ownname => 'dbe_stats_export', tabname => 't1', colname=> 'a', partname => null, stattab => 'export_table', statid => 't1_c'); export_column_stats --------------------- (1 row) gaussdb=# SELECT relname,columnname,stadistinct,stakind1,stanumbers1,stavalues1 FROM export_table; relname | columnname | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+------------+-------------+----------+-------------+--------------- t1 | a | -1 | 2 | | {100,150,250} (1 row) --查看表达式统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='idx_t1_expr'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+-------------+--------------------- 1 | -1 | 2 | | {10000,22500,62500} 2 | -1 | 2 | | {200,300,500} 3 | -1 | 2 | | {30000,37500,82500} (3 rows) --导出表达式统计信息,查看用户统计信息表。 gaussdb=# CALL DBE_STATS.EXPORT_COLUMN_STATS(ownname => 'dbe_stats_export', tabname => 'idx_t1_expr', colname => 'expr', stattab => 'export_table', statid => 't1_expr'); export_column_stats --------------------- (1 row) gaussdb=# SELECT relname,columnname,stadistinct,stakind1,stanumbers1,stavalues1 FROM export_table where statid='t1_expr'; relname | columnname | stadistinct | stakind1 | stanumbers1 | stavalues1 -------------+------------+-------------+----------+-------------+--------------------- idx_t1_expr | expr | -1 | 2 | | {10000,22500,62500} (1 row) --导出多列统计信息。 --查看多列统计信息。 gaussdb=# SELECT stakey,staextname,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC_EXT WHERE starelid='t1'::REGCLASS; stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 --------+---------------------+-------------+----------+-------------+------------ 1 2 | extname_-1308656218 | -1 | 8 | | (1 row) --导出,查看用户统计信息表。 gaussdb=# CALL DBE_STATS.EXPORT_COLUMN_STATS(ownname => 'dbe_stats_export', tabname => 't1', colname=> 'extname_-1308656218', partname => null, stattab => 'export_table', statid => 't1_c'); export_column_stats --------------------- (1 row) gaussdb=# SELECT relname,columnname,stadistinct,stakind1,stanumbers1,stavalues1 FROM export_table; relname | columnname | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+---------------------+-------------+----------+-------------+--------------- t1 | a | -1 | 2 | | {100,150,250} t1 | extname_-1308656218 | -1 | 8 | | (2 rows) --删除表、命名空间。 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP TABLE export_table; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_export; DROP SCHEMA
- DBE_STATS.EXPORT_SCHEMA_STATS
用于检索指定schema的统计信息,并存储在用户统计信息表中。该接口无返回值。
DBE_STATS.EXPORT_SCHEMA_STATS的函数原型为:
DBE_STATS.EXPORT_TABLE_STATS ( ownname VARCHAR2, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, stat_category VARCHAR2 DEFAULT NULL);
表20 DBE_STATS.EXPORT_SCHEMA_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定schema的名称,如果设置为null,会默认使用当前的schema。
stattab
VARCHAR2
否
指定存储统计信息用户表的表名。
statid
VARCHAR2
是
指向stattab中统计信息的标识符(可选)。
statown
VARCHAR2
是
暂不支持。
stat_category
VARCHAR2
是
暂不支持。
- 要调用此过程导出表统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 调用此过程将统计信息导出到用户统计信息表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导出当前用户在指定schema下所有具有权限的表的统计信息,对于无权限的表直接跳过,不报错。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 导出schema的统计信息同导出表统计信息用法一致,此处仅展示接口调用方式,具体示例可参考DBE_STATS.EXPORT_TABLE_STATS示例。 gaussdb=# CALL DBE_STATS.EXPORT_SCHEMA_STATS(ownname => 'dbe_stats_export', stattab => 'export_table', statid => 's1'); export_schema_stats --------------------- (1 row)
- DBE_STATS.IMPORT_INDEX_STATS
从stattab标识的用户统计信息表中检索指定索引的统计信息,并将其写回系统表中。该接口无返回值。
DBE_STATS.IMPORT_INDEX_STATS的函数原型:
DBE_STATS.IMPORT_INDEX_STATS ( ownname VARCHAR2, indname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE );
表21 DBE_STATS.IMPORT_INDEX_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定schema的名称,如果设置为null,会默认使用当前的schema。
indname
VARCHAR2
否
指定需要导入统计信息的索引名。
partname
VARCHAR2
是
索引分区的名称。如果索引已分区但是partname为null,则导入全局和分区索引统计信息。
stattab
VARCHAR2
否
指定存储统计信息用户表的表名。
statid
VARCHAR2
是
指向stattab中统计信息的标识符(可选)。
statown
VARCHAR2
是
暂不支持。
no_invalidate
BOOLEAN
是
暂不支持。
force
BOOLEAN
是
是否强制导入,忽略锁的状态,默认FALSE。
- 要调用此过程导入统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 调用此过程将统计信息从用户统计信息表导回系统表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导入索引的reltuples(numrows)、relpages(numlblks)和relallvisible(relallvisible)三类统计信息。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表,收集统计信息。 gaussdb=# CREATE SCHEMA dbe_stats_import; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_import; SET gaussdb=# CREATE TABLE t2(a int, b int, c int) PARTITION BY RANGE(a) SUBPARTITION BY RANGE(b) ( PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION s1 VALUES LESS THAN (500), SUBPARTITION s2 VALUES LESS THAN (MAXVALUE) ), PARTITION p2 VALUES LESS THAN(500) (SUBPARTITION s3 VALUES LESS THAN (500), SUBPARTITION s4 VALUES LESS THAN (MAXVALUE) ), PARTITION p3 VALUES LESS THAN(MAXVALUE) ( SUBPARTITION s5 VALUES LESS THAN (500), SUBPARTITION s6 VALUES LESS THAN (MAXVALUE) ) ); CREATE TABLE gaussdb=# CREATE INDEX idx_t2_local_a ON t2(a) LOCAL ( PARTITION p1_idx_a ( SUBPARTITION s1_idx_a, SUBPARTITION s2_idx_a ), PARTITION p2_idx_a ( SUBPARTITION s3_idx_a, SUBPARTITION s4_idx_a ), PARTITION p3_idx_a ( SUBPARTITION s5_idx_a, SUBPARTITION s6_idx_a )); CREATE INDEX gaussdb=# INSERT INTO t2 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (100, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 400, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 600, 1); INSERT 0 1 gaussdb=# ANALYZE t2; ANALYZE -- 创建用户统计信息表,先将数据导出。 gaussdb=# CALL DBE_STATS.CREATE_STAT_TABLE('dbe_stats_import', 'export_table'); create_stat_table ------------------- (1 row) gaussdb=# CALL DBE_STATS.IMPORT_INDEX_STATS(ownname => 'dbe_stats_import', indname => 'idx_t2_local_a', partname=> null, stattab => 'export_table', statid => 'idx_s1'); export_index_stats -------------------- (1 row) gaussdb=# SELECT relname,partname,numrows,numblocks FROM export_table; relname | partname | numrows | numblocks ----------------+----------+---------+----------- idx_t2_local_a | | 6 | 6 idx_t2_local_a | s6_idx_a | 0 | 1 idx_t2_local_a | s5_idx_a | 0 | 1 idx_t2_local_a | s4_idx_a | 0 | 1 idx_t2_local_a | s3_idx_a | 0 | 1 idx_t2_local_a | s2_idx_a | 0 | 1 idx_t2_local_a | s1_idx_a | 0 | 1 (7 rows) -- 再次插入数据,收集统计信息,查看统计信息。 gaussdb=# INSERT INTO t2 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (100, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (100, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 400, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 600, 1); INSERT 0 1 gaussdb=# ANALYZE t2; ANALYZE gaussdb=# SELECT relpages,reltuples FROM PG_CLASS WHERE relname='idx_t2_local_a'; relpages | reltuples ----------+----------- 6 | 12 (1 row) gaussdb=# SELECT relname,relpages,reltuples FROM PG_PARTITION WHERE parentid='idx_t2_local_a'::REGCLASS; relname | relpages | reltuples ----------+----------+----------- s1_idx_a | 1 | 0 s2_idx_a | 1 | 0 s3_idx_a | 1 | 0 s4_idx_a | 1 | 0 s5_idx_a | 1 | 0 s6_idx_a | 1 | 0 (6 rows) -- 将用户统计表中的统计信息导入统计信息系统表。 gaussdb=# CALL DBE_STATS.IMPORT_INDEX_STATS(ownname => 'dbe_stats_import', indname => 'idx_t2_local_a', stattab => 'export_table', statid => 'idx_s1'); import_index_stats -------------------- (1 row) gaussdb=# SELECT relpages,reltuples FROM PG_CLASS WHERE relname='idx_t2_local_a'; relpages | reltuples ----------+----------- 6 | 6 (1 row) gaussdb=# SELECT relname,relpages,reltuples FROM PG_PARTITION WHERE parentid='idx_t2_local_a'::REGCLASS; relname | relpages | reltuples ----------+----------+----------- s1_idx_a | 1 | 0 s2_idx_a | 1 | 0 s3_idx_a | 1 | 0 s4_idx_a | 1 | 0 s5_idx_a | 1 | 0 s6_idx_a | 1 | 0 (6 rows) -- 删除表、命名空间。 gaussdb=# DROP TABLE t2; DROP TABLE gaussdb=# DROP TABLE export_table; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_import; DROP SCHEMA
- DBE_STATS.IMPORT_TABLE_STATS
从stattab标识的用户统计信息表中检索指定表的统计信息,并将其写回系统表中。该接口无返回值。
DBE_STATS.IMPORT_TABLE_STATS的函数原型:
DBE_STATS.IMPORT_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, cascade BOOLEAN DEFAULT TRUE, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE, stat_category VARCHAR2 DEFAULT NULL );
表22 DBE_STATS.IMPORT_TABLE_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
varchar2
否
指定schema的名称,如果设置为null,会默认使用当前的schema。
tabname
varchar2
否
指定需要导入统计信息的表名。
partname
varchar2
是
表分区的名称。如果表已分区但是partname为null,则导入全局和分区表统计信息。
stattab
varchar2
否
指定存储统计信息用户表的表名。
statid
varchar2
是
指向stattab中统计信息的标识符(可选)。
cascade
boolean
是
是否一并导入列、索引、多列和索引表达式的统计信息。默认为true。
statown
varchar2
是
暂不支持。
no_invalidate
boolean
是
暂不支持。
force
boolean
是
是否强制导入,忽略锁的状态,默认FALSE。
stat_category
varchar2
是
暂不支持。
- 要调用此过程导入统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 调用此过程将统计信息从用户统计信息表导回系统表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导入表的reltuples(numrows)、relpages(numblks)和relallvisible(relallvisible)三类统计信息。级联导入列级、索引级的统计信息参考IMPORT_INDEX_STATS和IMPORT_COLUMN_STATS接口的统计信息。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 导入表的统计信息同导入索引统计信息用法一致,此处仅展示接口调用方式,具体示例可参考DBE_STATS.IMPORT_INDEX_STATS示例。 gaussdb=# CALL DBE_STATS.IMPORT_TABLE_STATS(ownname => 'dbe_stats_import', tabname => 't2', partname => 'p1', stattab => 'export_table', statid => 't1_t', cascade => true, force => false); import_table_stats -------------------- (1 row)
- DBE_STATS.IMPORT_COLUMN_STATS
从stattab标识的用户统计信息表中检索指定列(多列/表达式)的统计信息,并将其写回系统表中。该接口无返回值。
DBE_STATS.IMPORT_COLUMN_STATS的函数原型:
DBE_STATS.IMPORT_COLUMN_STATS ( ownname VARCHAR2, tabname VARCHAR2, colname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE );
表23 DBE_STATS.IMPORT_COLUMN_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定schema的名称,如果设置为null,会默认使用当前的schema。
tabname
VARCHAR2
否
指定需要导入统计信息的列所属的表名(表达式对应索引名)。
colname
VARCHAR2
否
列名或者多列名(tabname为索引时,colname为表达式名)。
partname
VARCHAR2
是
分区的名称。如果表/索引已分区但是partname为null,则导入全局和分区列/多列/索引表达式统计信息。
stattab
VARCHAR2
否
指定存储统计信息用户表的表名。
statid
VARCHAR2
是
指向stattab中统计信息的标识符(可选)。
statown
VARCHAR2
是
暂不支持。
no_invalidate
BOOLEAN
是
暂不支持。
force
BOOLEAN
是
是否强制导入,忽略锁的状态,默认FALSE。
- 要调用此过程导入统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 调用此过程将统计信息从用户统计信息表导回系统表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导入列级的统计信息可查询PG_STATISTIC或者PG_STATISTIC_EXT。
- 导入多列时,需先查询PG_STATISTIC_EXT中的staextname字段获取多列别名作为colname入参传入。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 建表,收集统计信息。 gaussdb=# CREATE SCHEMA dbe_stats_import; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_import; SET gaussdb=# CREATE TABLE IF NOT EXISTS t1 (a int, b int, c int); CREATE TABLE gaussdb=# CREATE INDEX idx_t1_expr on t1((a*a), (a+a), (a*b)); CREATE INDEX gaussdb=# INSERT INTO t1 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (150, 550, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (250, 150, 1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE gaussdb=# ANALYZE t1((a,b)); ANALYZE -- 建立用户统计信息表,先将单列、多列统计信息导出。 gaussdb=# CALL DBE_STATS.CREATE_STAT_TABLE('dbe_stats_import', 'export_table'); create_stat_table ------------------- (1 row) gaussdb=# SELECT stakey,staextname,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC_EXT WHERE starelid='t1'::REGCLASS; stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 --------+---------------------+-------------+----------+-------------+------------ 1 2 | extname_-1308656218 | -1 | 8 | | (1 row) gaussdb=# CALL DBE_STATS.EXPORT_COLUMN_STATS(ownname => 'dbe_stats_import', tabname => 't1', colname=> 'a', partname => null, stattab => 'export_table', statid => 't1_c'); export_column_stats --------------------- (1 row) gaussdb=# CALL DBE_STATS.EXPORT_COLUMN_STATS(ownname => 'dbe_stats_import', tabname => 'idx_t1_expr', colname => 'expr', stattab => 'export_table', statid => 't1_expr'); export_column_stats --------------------- (1 row) gaussdb=# CALL DBE_STATS.EXPORT_COLUMN_STATS(ownname => 'dbe_stats_import', tabname => 't1', colname=> 'extname_-1308656218', partname => null, stattab => 'export_table', statid => 't1_c'); export_column_stats --------------------- (1 row) gaussdb=# SELECT relname,columnname,stadistinct,stakind1,stanumbers1,stavalues1 FROM export_table; relname | columnname | stadistinct | stakind1 | stanumbers1 | stavalues1 -------------+---------------------+-------------+----------+-------------+--------------------- idx_t1_expr | expr | -1 | 2 | | {10000,22500,62500} t1 | a | -1 | 2 | | {100,150,250} t1 | extname_-1308656218 | -1 | 8 | | (3 rows) -- 再次插入数据,收集统计信息,查看系统表。 gaussdb=# INSERT INTO t1 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (150, 550, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (250, 150, 1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE gaussdb=# ANALYZE t1((a,b)); ANALYZE --查看import前列统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+---------------------------+--------------- 1 | -.5 | 1 | {.333333,.333333,.333333} | {100,150,250} 2 | -.5 | 1 | {.333333,.333333,.333333} | {150,300,550} 3 | -.166667 | 1 | {1} | {1} (3 rows) --查看import前表达式统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='idx_t1_expr'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+---------------------------+--------------------- 1 | -.5 | 1 | {.333333,.333333,.333333} | {10000,22500,62500} 2 | -.5 | 1 | {.333333,.333333,.333333} | {200,300,500} 3 | -.5 | 1 | {.333333,.333333,.333333} | {30000,37500,82500} (3 rows) --查看import前的多列统计信息。 gaussdb=# SELECT stakey,staextname,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC_EXT WHERE starelid='t1'::REGCLASS; stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 --------+---------------------+-------------+----------+-------------+------------ 1 2 | extname_-1308656218 | -.5 | 8 | | (1 row) -- 导入单列、多列统计信息,查看系统表。 gaussdb=# CALL DBE_STATS.IMPORT_COLUMN_STATS(ownname => 'dbe_stats_import', tabname => 't1', colname=> 'a', partname => null, stattab => 'export_table', statid => 't1_c', force => false); import_column_stats --------------------- (1 row) gaussdb=# CALL DBE_STATS.IMPORT_COLUMN_STATS(ownname => 'dbe_stats_import', tabname => 'idx_t1_expr', colname=> 'expr', partname => null, stattab => 'export_table', statid => 't1_expr', force => false); import_column_stats --------------------- (1 row) gaussdb=# CALL DBE_STATS.IMPORT_COLUMN_STATS(ownname => 'dbe_stats_import', tabname => 't1', colname=> 'extname_-1308656218', partname => null, stattab => 'export_table', statid => 't1_c', force => false); import_column_stats --------------------- (1 row) --查看import后的列级统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+---------------------------+--------------- 1 | -1 | 2 | | {100,150,250} 2 | -.5 | 1 | {.333333,.333333,.333333} | {150,300,550} 3 | -.166667 | 1 | {1} | {1} (3 rows) --查看import后的表达式级统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='idx_t1_expr'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+-------------+--------------------- 1 | -1 | 2 | | {10000,22500,62500} 2 | -1 | 2 | | {200,300,500} 3 | -1 | 2 | | {30000,37500,82500} (3 rows) --查看import后的多列统计信息。 gaussdb=# SELECT stakey,staextname,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC_EXT WHERE starelid='t1'::REGCLASS; stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 --------+---------------------+-------------+----------+-------------+------------ 1 2 | extname_-1308656218 | -1 | 8 | | (1 row) -- 删除表、删除命名空间。 gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP TABLE export_table; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_import; DROP SCHEMA
- DBE_STATS.IMPORT_SCHEMA_STATS
从stattab标识的用户统计信息表中检索指定schema的统计信息,并将其写回系统表中。该接口无返回值。
DBE_STATS.IMPORT_SCHEMA_STATS的函数原型:
DBE_STATS.IMPORT_SCHEMA_STATS ( ownname VARCHAR2, stattab VARCHAR2, statid VARCHAR2 DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE, stat_category VARCHAR2 DEFAULT NULL);
表24 DBE_STATS.IMPORT_SCHEMA_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
指定schema的名称,如果设置为null,会默认使用当前的schema。
stattab
VARCHAR2
否
指定存储统计信息用户表的表名。
statid
VARCHAR2
是
指向stattab中统计信息的标识符(可选)。
statown
VARCHAR2
是
暂不支持。
no_invalidate
BOOLEAN
是
暂不支持。
force
BOOLEAN
是
是否强制导入,忽略锁的状态,默认FALSE。
stat_category
VARCHAR2
是
暂不支持。
- 要调用此过程导入统计信息,需要对指定的表具有同ANALYZE命令一样的权限,可以参考ANALYZE | ANALYSE。
- 调用此过程将统计信息从用户统计信息表导回系统表,需要对用户统计信息表具有SELECT、INSERT、DELETE和UPDATE的权限。
- 导入当前用户在指定schema下所有具有权限的表的统计信息,对于无权限的表直接跳过,不报错。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 导入schema的统计信息同导入表的统计信息用法一致,此处仅展示接口调用方式,具体示例可参考DBE_STATS.IMPORT_TABLE_STATS示例。 gaussdb=# CALL DBE_STATS.IMPORT_SCHEMA_STATS(ownname => 'dbe_stats_import', stattab => 'export_table', statid => 's1',force => false); import_schema_stats --------------------- (1 row)
- DBE_STATS.SET_COLUMN_STATS
设置列相关的统计信息,包括设置单列、多列和表达式统计信息。该接口无返回值。
DBE_STATS.SET_COLUMN_STATS函数原型为:
DBE_STATS.SET_COLUMN_STATS ( ownname VARCHAR2, tabname VARCHAR2, colname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2 DEFAULT NULL, statid VARCHAR2 DEFAULT NULL, distcnt NUMBER DEFAULT NULL, density NUMBER DEFAULT NULL, nullcnt NUMBER DEFAULT NULL, srec VARCHAR2 DEFAULT NULL, avgclen NUMBER DEFAULT NULL, flags NUMBER DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE );
表25 DBE_STATS.SET_COLUMN_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
该表所在的schema。如果设置为null,则默认使用当前schema。
tabname
VARCHAR2
否
表名。
colname
VARCHAR2
否
列名。
partname
VARCHAR2
是
要设置统计信息的表分区的名称。如果表已分区且partname为null,则设置全局级别的列级统计信息。
stattab
VARCHAR2
是
暂不支持此参数。
statid
VARCHAR2
是
暂不支持此参数。
distcnt
NUMBER
是
设置该列中NDV数量。
density
NUMBER
是
暂不支持。
nullcnt
NUMBER
是
设置该列中null值数量。
srec
VARCHAR2
是
暂不支持此参数。
avgclen
NUMBER
是
设置该列中字段的平均长度(以字节为单位)。
flags
NUMBER
是
暂不支持此参数。
statown
VARCHAR2
是
暂不支持此参数。
no_invalidate
BOOLEAN
是
暂不支持此参数。
force
NUMBER
是
决定统计信息被锁定时的行为。如果为true,则即使列级统计信息被锁定,该过程也会设置值。默认为FALSE。
- 要调用此过程设置表的列级统计信息,需要对该列涉及的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 该接口支持设置表达式统计信息,由于表达式的创建依赖于索引,因此当调用该接口设置表达式统计信息时,tabname应该传入该索引的名称。
- 当前仅支持设置列的NDV(distcnt)、nullfrac(nullcnt)和width(avgclen)三类统计信息。
- 当单列、表达式统计信息被删除后,仍然支持调用该接口设置对应的单列、表达式统计信息,此时PG_STATISTIC系统表中将插入新的数据。但对于多列统计信息,当其被删除后,不支持使用该接口进行重新设置。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 前置条件,建表,收集统计信息。 gaussdb=# CREATE SCHEMA dbe_stats_set_schema; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_set_schema; SET gaussdb=# DROP TABLE IF EXISTS t1; NOTICE: table "t1" does not exist, skipping DROP TABLE gaussdb=# CREATE TABLE IF NOT EXISTS t1 (a int, b int, c int); CREATE TABLE gaussdb=# CREATE INDEX idx_t1_expr ON t1((a*a), (a+a), (a*b)); CREATE INDEX gaussdb=# INSERT INTO t1 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (150, 550, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (250, 150, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (250, 150, 1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE gaussdb=# ANALYZE t1((a, b)); ANALYZE -- 设置单列统计信息。 -- 查询原有统计信息。 gaussdb=# SELECT staattnum,stanullfrac,stawidth,stadistinct FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stanullfrac | stawidth | stadistinct -----------+-------------+----------+------------- 1 | 0 | 4 | -.75 2 | 0 | 4 | -.75 3 | 0 | 4 | -.25 (3 rows) -- 设置列级统计信息后重新查询。 gaussdb=# CALL DBE_STATS.SET_COLUMN_STATS(ownname => 'dbe_stats_set_schema', tabname => 't1', colname => 'a', distcnt => 6, nullcnt => 5, avgclen => 42); set_column_stats ------------------ (1 row) gaussdb=# SELECT staattnum,stanullfrac,stawidth,stadistinct FROM PG_STATISTIC WHERE starelid='t1'::REGCLASS; staattnum | stanullfrac | stawidth | stadistinct -----------+-------------+----------+------------- 1 | 1 | 42 | 6 2 | 0 | 4 | -.75 3 | 0 | 4 | -.25 (3 rows) -- 设置多列统计信息。 -- 查询原有统计信息。 gaussdb=# SELECT stakey,staextname,stanullfrac,stawidth,stadistinct FROM PG_STATISTIC_EXT WHERE starelid='t1'::REGCLASS; stakey | staextname | stanullfrac | stawidth | stadistinct --------+---------------------+-------------+----------+------------- 1 2 | extname_-1308656218 | 0 | 8 | -.75 (1 row) -- 设置统计信息后重新查询 gaussdb=# CALL DBE_STATS.SET_COLUMN_STATS(ownname => 'dbe_stats_set_schema', tabname => 't1', colname => 'extname_-1308656218', distcnt => 5, nullcnt => 5, avgclen => 2); set_column_stats ------------------ (1 row) gaussdb=# SELECT stakey,staextname,stanullfrac,stawidth,stadistinct FROM PG_STATISTIC_EXT WHERE starelid='t1'::REGCLASS; stakey | staextname | stanullfrac | stawidth | stadistinct --------+---------------------+-------------+----------+------------- 1 2 | extname_-1308656218 | 1 | 2 | 5 (1 row) -- 设置表达式统计信息。 -- 查询原有统计信息。 gaussdb=# SELECT staattnum,stanullfrac,stawidth,stadistinct FROM PG_STATISTIC WHERE starelid='idx_t1_expr'::REGCLASS; staattnum | stanullfrac | stawidth | stadistinct -----------+-------------+----------+------------- 1 | 0 | 4 | -.75 2 | 0 | 4 | -.75 3 | 0 | 4 | -.75 (3 rows) -- 查询表达式列名 gaussdb=# SELECT attnum, attname FROM PG_ATTRIBUTE WHERE attrelid='idx_t1_expr'::REGCLASS; attnum | attname --------+--------- 1 | expr 2 | expr1 3 | expr2 (3 rows) -- 设置统计信息后重新查询。 gaussdb=# CALL DBE_STATS.SET_COLUMN_STATS(ownname => 'dbe_stats_set_schema', tabname => 'idx_t1_expr', colname => 'expr', distcnt => 13, nullcnt => 5, avgclen => 22); set_column_stats ------------------ (1 row) gaussdb=# SELECT staattnum,stanullfrac,stawidth,stadistinct FROM PG_STATISTIC WHERE starelid='idx_t1_expr'::REGCLASS; staattnum | stanullfrac | stawidth | stadistinct -----------+-------------+----------+------------- 1 | 1 | 22 | 13 2 | 0 | 4 | -.75 3 | 0 | 4 | -.75 (3 rows) -- 删除表、命名空间。 gaussdb=# DROP INDEX idx_t1_expr; DROP INDEX gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_set_schema cascade; DROP SCHEMA
- DBE_STATS.SET_INDEX_STATS
DBE_STATS.SET_INDEX_STATS的函数原型为:
DBE_STATS.SET_INDEX_STATS ( ownname VARCHAR2, indname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2 DEFAULT NULL, statid VARCHAR2 DEFAULT NULL, numrows NUMBER DEFAULT NULL, numlblks NUMBER DEFAULT NULL, relallvisible NUMBER DEFAULT NULL, numdist NUMBER DEFAULT NULL, avglblk NUMBER DEFAULT NULL, avgdblk NUMBER DEFAULT NULL, clstfct NUMBER DEFAULT NULL, indlevel NUMBER DEFAULT NULL, flags NUMBER DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, guessq NUMBER DEFAULT NULL, cachedblk NUMBER DEFAULT NULL, cachehit NUMBER DEFAULT NULL, force BOOLEAN DEFAULT FALSE );
表26 DBE_STATS.SET_INDEX_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
该索引所在的schema。如果设置为null,则默认使用当前schema。
indname
VARCHAR2
否
索引名。
partname
VARCHAR2
是
要设置统计信息的索引分区的名称。如果索引已分区且partname为null,则设置全局索引级别的统计信息。
stattab
VARCHAR2
是
暂不支持该参数。
statid
VARCHAR2
是
暂不支持该参数。
numrows
NUMBER
是
设置索引的行数。
numlblks
NUMBER
是
设置索引的页数。
relallvisible
NUMBER
是
设置被标识为全可见的索引中的页的数量。
numdist
NUMBER
是
暂不支持该参数。
avglblk
NUMBER
是
暂不支持此参数。
avgdblk
NUMBER
是
暂不支持此参数。
clstfct
NUMBER
是
暂不支持此参数。
indlevel
NUMBER
是
暂不支持此参数。
flags
NUMBER
是
暂不支持此参数。
statown
VARCHAR2
是
暂不支持此参数。
no_invalidate
BOOLEAN
是
暂不支持此参数。
guessq
NUMBER
是
暂不支持此参数。
cachedblk
NUMBER
是
暂不支持此参数。
cachehit
NUMBER
是
暂不支持此参数。
force
BOOLEAN
是
决定统计信息被锁定时的行为。如果为TRUE,则即使索引统计信息被锁定,该过程也会设置值。默认为FALSE。
- 要调用此过程设置索引统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 当前仅支持设置索引的reltuples(numrows)、relpages(numlblks)和relallvisible(relallvisible)三类统计信息。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 前置条件,建表,收集统计信息。 gaussdb=# CREATE SCHEMA dbe_stats_set_schema; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_set_schema; SET gaussdb=# DROP TABLE IF EXISTS t1; NOTICE: table "t1" does not exist, skipping DROP TABLE gaussdb=# CREATE TABLE IF NOT EXISTS t1 (a int, b int, c int); CREATE TABLE gaussdb=# CREATE INDEX idx_t1_a on t1(a); CREATE INDEX gaussdb=# INSERT INTO t1 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (150, 550, 1); INSERT 0 1 gaussdb=# INSERT INTO t1 VALUES (250, 150, 1); INSERT 0 1 gaussdb=# ANALYZE t1; ANALYZE -- 设置索引统计信息。 -- 查看当前索引统计信息。 gaussdb=# SELECT reltuples,relpages,relallvisible FROM PG_CLASS WHERE relname='idx_t1_a'; reltuples | relpages | relallvisible -----------+----------+--------------- 3 | 2 | 0 (1 row) -- 设置统计信息后重新查询。 gaussdb=# CALL DBE_STATS.SET_INDEX_STATS(indname => 'idx_t1_a', ownname => 'dbe_stats_set_schema', numrows => 1, numlblks => 3, relallvisible => 6); set_index_stats ----------------- (1 row) gaussdb=# SELECT reltuples,relpages,relallvisible FROM PG_CLASS WHERE relname='idx_t1_a'; reltuples | relpages | relallvisible -----------+----------+--------------- 1 | 3 | 6 (1 row) -- 删除表、命名空间。 gaussdb=# DROP INDEX idx_t1_a; DROP INDEX gaussdb=# DROP TABLE t1; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_set_schema CASCADE; DROP SCHEMA
- DBE_STATS.SET_TABLE_STATS
DBE_STATS.SET_TABLE_STATS函数原型为:
DBE_STATS.SET_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2 DEFAULT NULL, statid VARCHAR2 DEFAULT NULL, numrows NUMBER DEFAULT NULL, numblks NUMBER DEFAULT NULL, relallvisible NUMBER DEFAULT NULL, avgrlen NUMBER DEFAULT NULL, flags NUMBER DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, cachedblk NUMBER DEFAULT NULL, cachehit NUMBER DEFAULT NULL, force BOOLEAN DEFAULT FALSE, im_imcu_count NUMBER DEFAULT NULL, im_block_count NUMBER DEFAULT NULL, scanrate NUMBER DEFAULT NULL );
表27 DBE_STATS.SET_TABLE_STATS接口参数说明 参数
参数
是否允许为空
描述
ownname
VARCHAR2
否
该表所在的schema。如果设置为null,则默认使用当前schema。
tabname
VARCHAR2
否
表名。
partname
VARCHAR2
是
要设置统计信息的表分区的名称。如果表已分区且partname为null,则设置全局表级别的统计信息。
stattab
VARCHAR2
是
暂不支持该参数。
statid
VARCHAR2
是
暂不支持该参数。
numrows
NUMBER
是
设置表的行数。
numblks
NUMBER
是
设置表的页数。
relallvisible
NUMBER
是
设置被标识为全可见的表中的页的数量。
avgrlen
NUMBER
是
暂不支持该参数。
flags
NUMBER
是
暂不支持此参数。
statown
VARCHAR2
是
暂不支持此参数。
no_invalidate
BOOLEAN
是
暂不支持此参数。
cachedblk
NUMBER
是
暂不支持此参数。
cachehit
NUMBER
是
暂不支持此参数。
force
BOOLEAN
是
决定统计信息被锁定时的行为。如果为TRUE,则即使表统计信息被锁定,该过程也会设置值。默认为FALSE。
im_imcu_count
NUMBER
是
暂不支持此参数。
im_block_count
NUMBER
是
暂不支持此参数。
scanrate
NUMBER
是
暂不支持此参数。
- 要调用此过程设置表的统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 当前仅支持设置表的reltuples(numrows)、relpages(numblks)和relallvisible(relallvisible)三类统计信息。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
--与设置索引统计信息类似,此处只展示接口调用方式,具体使用示例参考DBE_STATS.SET_INDEX_STATS接口示例。 --设置表级统计信息。 gaussdb=# CALL DBE_STATS.SET_TABLE_STATS(tabname => 't1', ownname => 'dbe_stats_set_schema', numrows => 1, numblks => 3, relallvisible => 6); set_table_stats ----------------- (1 row)
- DBE_STATS.DELETE_COLUMN_STATS
删除列相关的统计信息,包括删除单列、多列和表达式统计信息。该接口无返回值。
DBE_STATS.DELETE_COLUMN_STATS函数原型为:
DBE_STATS.DELETE_COLUMN_STATS ( ownname VARCHAR2, tabname VARCHAR2, colname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2 DEFAULT NULL, statid VARCHAR2 DEFAULT NULL, cascade_parts BOOLEAN DEFAULT TRUE, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE, col_stat_type VARCHAR2 DEFAULT NULL );
表28 DBE_STATS.DELETE_COLUMN_STATS接口参数说明 参数
类型
是否允许为空
说明
ownname
VARCHAR2
否
该表所在的schema。如果设置为null,则默认使用当前schema。
tabname
VARCHAR2
否
表名。
colname
VARCHAR2
否
列名。
partname
VARCHAR2
是
要删除统计信息的表分区的名称。如果表已分区且partname为null,则删除全局级别的列级统计信息,并且如果cascade_parts为true,则级联删除所有分区的列级统计信息。
stattab
VARCHAR2
是
暂不支持此参数。
statid
VARCHAR2
是
暂不支持此参数。
cascade_parts
BOOLEAN
是
决定在删除列级统计信息时是否将其下面的所有分区的统计信息级联删除。默认为true。
statown
VARCHAR2
是
暂不支持此参数。
no_invalidate
BOOLEAN
是
暂不支持此参数。
force
BOOLEAN
是
决定统计信息被锁定时的行为。如果为true,则即使列统计信息被锁定,该过程也会将其删除。默认为false。
col_stat_type
VARCHAR2
是
暂不支持此参数。
- 要调用此过程删除列的统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 该接口支持删除表达式统计信息,由于表达式的创建依赖于索引,因此当调用该接口删除表达式统计信息时,tabname应该传入该索引的名称。
- 如果表是一个二级分区表,且指定partname为一级分区名,此时如果cascade_parts为true,则会将该一级分区下的所有二级分区统计信息一并删除。
- 删除多列统计信息时,需先查询PG_STATISTIC_EXT中的staextname字段获取多列别名作为colname入参传入。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 前置条件,建表,收集统计信息。 gaussdb=# CREATE SCHEMA dbe_stats_delete_schema; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_delete_schema; SET gaussdb=# DROP TABLE IF EXISTS t2; NOTICE: table "t2" does not exist, skipping DROP TABLE gaussdb=# CREATE TABLE t2(a int, b int, c int) PARTITION BY RANGE(a) SUBPARTITION BY RANGE(b) ( PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION s1 VALUES LESS THAN (500), SUBPARTITION s2 VALUES LESS THAN (MAXVALUE) ), PARTITION p2 VALUES LESS THAN(500) (SUBPARTITION s3 VALUES LESS THAN (500), SUBPARTITION s4 VALUES LESS THAN (MAXVALUE) ), PARTITION p3 VALUES LESS THAN(MAXVALUE) ( SUBPARTITION s5 VALUES LESS THAN (500), SUBPARTITION s6 VALUES LESS THAN (MAXVALUE) )); CREATE TABLE gaussdb=# INSERT INTO t2 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (100, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 400, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 600, 1); INSERT 0 1 gaussdb=# ANALYZE t2; ANALYZE gaussdb=# ANALYZE t2((a, b)); ANALYZE -- 删除t2表的单列统计信息,不级联分区,分区统计信息仍然存在。 -- 查看表级列的统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t2'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+---------------------------+--------------- 1 | -.5 | 1 | {.333333,.333333,.333333} | {100,300,600} 2 | -.5 | 1 | {.5,.333333} | {600,300} 3 | -.166667 | 1 | {1} | {1} (3 rows) -- 查看分区级列的统计信息。 gaussdb=# SELECT part.relname,s.staattnum,s.stadistinct,s.stakind1,s.stanumbers1,s.stavalues1 FROM PG_STATISTIC s,PG_PARTITION part WHERE part.parentid='t2'::REGCLASS and s.starelid=part.oid; relname | staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+-----------+-------------+----------+-------------+------------ p1 | 1 | -1 | 1 | {1} | {100} p1 | 2 | -1 | 2 | | {300,600} p1 | 3 | -1 | 1 | {1} | {1} p2 | 1 | -1 | 1 | {1} | {300} p2 | 2 | -1 | 2 | | {300,600} p2 | 3 | -1 | 1 | {1} | {1} p3 | 1 | -1 | 1 | {1} | {600} p3 | 2 | -1 | 2 | | {400,600} p3 | 3 | -1 | 1 | {1} | {1} (9 rows) -- 删除表级单列统计信息,不级联分区,表级不存在,分区级列的统计信息仍然存在。 gaussdb=# CALL DBE_STATS.DELETE_COLUMN_STATS(ownname => 'dbe_stats_delete_schema', tabname => 't2', colname => 'a', partname => null, cascade_parts => false); delete_column_stats --------------------- (1 row) gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t2'::REGCLASS; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+--------------+------------ 2 | -.5 | 1 | {.5,.333333} | {600,300} 3 | -.166667 | 1 | {1} | {1} (2 rows) gaussdb=# SELECT part.relname,s.staattnum,s.stadistinct,s.stakind1,s.stanumbers1,s.stavalues1 FROM PG_STATISTIC s,PG_PARTITION part WHERE part.parentid='t2'::REGCLASS and s.starelid=part.oid; relname | staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+-----------+-------------+----------+-------------+------------ p1 | 1 | -1 | 1 | {1} | {100} p1 | 2 | -1 | 2 | | {300,600} p1 | 3 | -1 | 1 | {1} | {1} p2 | 1 | -1 | 1 | {1} | {300} p2 | 2 | -1 | 2 | | {300,600} p2 | 3 | -1 | 1 | {1} | {1} p3 | 1 | -1 | 1 | {1} | {600} p3 | 2 | -1 | 2 | | {400,600} p3 | 3 | -1 | 1 | {1} | {1} (9 rows) -- 删除t2表的多列统计信息,级联分区,分区的列级统计信息被同时删除。 -- 查询统计信息。 gaussdb=# SELECT stakey,staextname,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC_EXT WHERE starelid='t2'::REGCLASS; stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 --------+---------------------+-------------+----------+-------------+------------ 1 2 | extname_-1308656218 | -1 | 8 | | (1 row) gaussdb=# SELECT part.relname,s.stakey,s.staextname,s.stadistinct,s.stakind1,s.stanumbers1,s.stavalues1 FROM PG_STATISTIC_EXT s,PG_PARTITION part WHERE part.parentid='t2'::REGCLASS and s.starelid=part.oid; relname | stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+--------+---------------------+-------------+----------+-------------+------------ p1 | 1 2 | extname_-1308656218 | -1 | 8 | | p2 | 1 2 | extname_-1308656218 | -1 | 8 | | p3 | 1 2 | extname_-1308656218 | -1 | 8 | | (3 rows) -- 删除多列统计信息,查询统计信息。 gaussdb=# CALL DBE_STATS.DELETE_COLUMN_STATS(ownname => 'dbe_stats_delete_schema', tabname => 't2', colname => 'extname_-1308656218', partname => null, cascade_parts => true); delete_column_stats --------------------- (1 row) gaussdb=# SELECT stakey,staextname,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC_EXT WHERE starelid='t2'::REGCLASS; stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 --------+------------+-------------+----------+-------------+------------ (0 rows) gaussdb=# SELECT part.relname,s.stakey,s.staextname,s.stadistinct,s.stakind1,s.stanumbers1,s.stavalues1 FROM PG_STATISTIC_EXT s,PG_PARTITION part WHERE part.parentid='t2'::REGCLASS and s.starelid=part.oid; relname | stakey | staextname | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+--------+------------+-------------+----------+-------------+------------ (0 rows) -- 指定删除p1分区的列级统计信息,表级、p2、p3列统计信息不受影响。 -- 查询统计信息。 gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t2'::REGCLASS and staattnum=2; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+--------------+------------ 2 | -.5 | 1 | {.5,.333333} | {600,300} (1 row) gaussdb=# SELECT part.relname,s.staattnum,s.stadistinct,s.stakind1,s.stanumbers1,s.stavalues1 FROM PG_STATISTIC s,PG_PARTITION part WHERE part.parentid='t2'::REGCLASS and s.starelid=part.oid and s.staattnum=2; relname | staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+-----------+-------------+----------+-------------+------------ p1 | 2 | -1 | 2 | | {300,600} p2 | 2 | -1 | 2 | | {300,600} p3 | 2 | -1 | 2 | | {400,600} (3 rows) -- 删除p1分区的列统计信息,查询统计信息。 gaussdb=# CALL DBE_STATS.DELETE_COLUMN_STATS(ownname => 'dbe_stats_delete_schema', tabname => 't2', colname => 'b', partname => 'p1', cascade_parts => false); delete_column_stats --------------------- (1 row) gaussdb=# SELECT staattnum,stadistinct,stakind1,stanumbers1,stavalues1 FROM PG_STATISTIC WHERE starelid='t2'::REGCLASS and staattnum=2; staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 -----------+-------------+----------+--------------+------------ 2 | -.5 | 1 | {.5,.333333} | {600,300} (1 row) gaussdb=# SELECT part.relname,s.staattnum,s.stadistinct,s.stakind1,s.stanumbers1,s.stavalues1 FROM PG_STATISTIC s,PG_PARTITION part WHERE part.parentid='t2'::REGCLASS and s.starelid=part.oid and s.staattnum=2; relname | staattnum | stadistinct | stakind1 | stanumbers1 | stavalues1 ---------+-----------+-------------+----------+-------------+------------ p2 | 2 | -1 | 2 | | {300,600} p3 | 2 | -1 | 2 | | {400,600} (2 rows) -- 删除表、命名空间。 gaussdb=# DROP TABLE t2; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_delete_schema CASCADE; DROP SCHEMA
- DBE_STATS.DELETE_INDEX_STATS
DBE_STATS.DELETE_INDEX_STATS的函数原型为:
DBE_STATS.DELETE_INDEX_STATS ( ownname VARCHAR2, indname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2 DEFAULT NULL, statid VARCHAR2 DEFAULT NULL, cascade_parts BOOLEAN DEFAULT TRUE, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, stattype VARCHAR2 DEFAULT NULL, force BOOLEAN DEFAULT FALSE, stat_category VARCHAR2 DEFAULT NULL )
表29 DBE_STATS.DELETE_INDEX_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
该索引所在的schema。如果设置为null,则默认使用当前schema。
indname
VARCHAR2
否
索引名。
partname
VARCHAR2
是
要删除统计信息的索引分区的名称。如果索引已分区且partname为null,则删除全局级别的索引统计信息,并且如果cascade_parts为true,则级联删除所有分区的索引统计信息。
stattab
VARCHAR2
是
暂不支持此参数。
statid
VARCHAR2
是
暂不支持此参数。
cascade_parts
BOOLEAN
是
决定在删除索引统计信息时是否将其下面的所有分区的索引统计信息级联删除。默认为true。
statown
VARCHAR2
是
暂不支持此参数。
no_invalidate
BOOLEAN
是
暂不支持此参数。
stattype
VARCHAR2
是
暂不支持此参数。
force
BOOLEAN
是
决定统计信息被锁定时的行为。如果为true,则即使索引统计信息被锁定,该过程也会将其删除。默认为false。
stat_category
VARCHAR2
是
暂不支持此参数。
- 要调用此过程删除索引的统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 删除索引的统计信息等同于将索引统计信息的reltuples、relpages和relallvisible信息置零。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 前置条件,建表。 gaussdb=# CREATE SCHEMA dbe_stats_delete_schema; CREATE SCHEMA gaussdb=# SET CURRENT_SCHEMA = dbe_stats_delete_schema; SET gaussdb=# DROP TABLE IF EXISTS t2; NOTICE: table "t2" does not exist, skipping DROP TABLE gaussdb=# CREATE TABLE t2(a int, b int, c int) PARTITION BY RANGE(a) SUBPARTITION BY RANGE(b) ( PARTITION p1 VALUES LESS THAN(200) (SUBPARTITION s1 VALUES LESS THAN (500), SUBPARTITION s2 VALUES LESS THAN (MAXVALUE) ), PARTITION p2 VALUES LESS THAN(500) (SUBPARTITION s3 VALUES LESS THAN (500), SUBPARTITION s4 VALUES LESS THAN (MAXVALUE) ), PARTITION p3 VALUES LESS THAN(MAXVALUE) ( SUBPARTITION s5 VALUES LESS THAN (500), SUBPARTITION s6 VALUES LESS THAN (MAXVALUE) )); CREATE TABLE gaussdb=# CREATE INDEX idx_t2_local_a ON t2(a) LOCAL ( PARTITION p1_idx_a ( SUBPARTITION s1_idx_a, SUBPARTITION s2_idx_a ), PARTITION p2_idx_a ( SUBPARTITION s3_idx_a, SUBPARTITION s4_idx_a ), PARTITION p3_idx_a ( SUBPARTITION s5_idx_a, SUBPARTITION s6_idx_a )); CREATE INDEX gaussdb=# INSERT INTO t2 VALUES (100, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (100, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 300, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (300, 600, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 400, 1); INSERT 0 1 gaussdb=# INSERT INTO t2 VALUES (600, 600, 1); INSERT 0 1 gaussdb=# ANALYZE t2; ANALYZE gaussdb=# ANALYZE t2((a, b)); ANALYZE -- 删除idx_t2_local_a索引的统计信息,不级联分区索引的统计信息。 -- 查看统计信息。 gaussdb=# SELECT relpages,reltuples FROM PG_CLASS WHERE relname='idx_t2_local_a'; relpages | reltuples ----------+----------- 6 | 6 (1 row) gaussdb=# SELECT relname,relpages,reltuples FROM PG_PARTITION WHERE parentid='idx_t2_local_a'::REGCLASS; relname | relpages | reltuples ----------+----------+----------- s1_idx_a | 1 | 0 s2_idx_a | 1 | 0 s3_idx_a | 1 | 0 s4_idx_a | 1 | 0 s5_idx_a | 1 | 0 s6_idx_a | 1 | 0 (6 rows) -- 删除统计信息,查询系统表。 gaussdb=# CALL DBE_STATS.DELETE_INDEX_STATS(ownname => 'dbe_stats_delete_schema', indname => 'idx_t2_local_a', partname => null, cascade_parts => false); delete_index_stats -------------------- (1 row) gaussdb=# SELECT relpages,reltuples FROM PG_CLASS WHERE relname='idx_t2_local_a'; relpages | reltuples ----------+----------- 0 | 0 (1 row) gaussdb=# SELECT relname,relpages,reltuples FROM PG_PARTITION WHERE parentid='idx_t2_local_a'::REGCLASS; relname | relpages | reltuples ----------+----------+----------- s1_idx_a | 1 | 0 s2_idx_a | 1 | 0 s3_idx_a | 1 | 0 s4_idx_a | 1 | 0 s5_idx_a | 1 | 0 s6_idx_a | 1 | 0 (6 rows) -- 删除idx_t2_local_a索引的s1_idx_a分区的统计信息。 gaussdb=# CALL DBE_STATS.DELETE_INDEX_STATS(ownname => 'dbe_stats_delete_schema', indname => 'idx_t2_local_a', partname => 's1_idx_a', cascade_parts => false); delete_index_stats -------------------- (1 row) gaussdb=# SELECT relname,relpages,reltuples FROM PG_PARTITION WHERE parentid='idx_t2_local_a'::REGCLASS; relname | relpages | reltuples ----------+----------+----------- s2_idx_a | 1 | 0 s3_idx_a | 1 | 0 s4_idx_a | 1 | 0 s5_idx_a | 1 | 0 s6_idx_a | 1 | 0 s1_idx_a | 0 | 0 (6 rows) -- 级联删除所有分区的索引统计信息。 gaussdb=# CALL DBE_STATS.DELETE_INDEX_STATS(ownname => 'dbe_stats_delete_schema', indname => 'idx_t2_local_a', partname => null, cascade_parts => true); delete_index_stats -------------------- (1 row) gaussdb=# SELECT relname,relpages,reltuples FROM PG_PARTITION WHERE parentid='idx_t2_local_a'::REGCLASS; relname | relpages | reltuples ----------+----------+----------- s6_idx_a | 0 | 0 s5_idx_a | 0 | 0 s4_idx_a | 0 | 0 s3_idx_a | 0 | 0 s2_idx_a | 0 | 0 s1_idx_a | 0 | 0 (6 rows) -- 删表、删除命名空间。 gaussdb=# DROP INDEX idx_t2_local_a; DROP INDEX gaussdb=# DROP TABLE t2; DROP TABLE gaussdb=# DROP SCHEMA dbe_stats_delete_schema CASCADE; DROP SCHEMA
- DBE_STATS.DELETE_TABLE_STATS
DBE_STATS.DELETE_TABLE_STATS的函数原型为:
DBE_STATS.DELETE_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2 DEFAULT NULL, stattab VARCHAR2 DEFAULT NULL, statid VARCHAR2 DEFAULT NULL, cascade_parts BOOLEAN DEFAULT TRUE, cascade_columns BOOLEAN DEFAULT TRUE, cascade_indexes BOOLEAN DEFAULT TRUE, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE, stat_category VARCHAR2 DEFAULT NULL )
表30 DBE_STATS.DELETE_TABLE_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
该表所在的schema。如果设置为null,则默认使用当前schema。
tabname
VARCHAR2
否
表名。
partname
VARCHAR2
是
要删除统计信息的表分区的名称。如果表已分区且partname为null,则删除全局级别的表统计信息,并且如果cascade_parts为true,则级联删除所有分区的表级统计信息。
stattab
VARCHAR2
是
暂不支持此参数。
statid
VARCHAR2
是
暂不支持此参数。
cascade_parts
BOOLEAN
是
决定在删除表级统计信息时是否将其下面的所有分区的表统计信息级联删除。默认为true。
cascade_columns
BOOLEAN
是
决定是否调用delete_column_stats删除该表的所有列级统计信息。默认为true。
cascade_indexes
BOOLEAN
是
决定是否调用delete_index_stats删除该表的所有索引统计信息。默认为true。
statown
VARCHAR2
是
暂不支持此参数。
no_invalidate
BOOLEAN
是
暂不支持此参数。
force
BOOLEAN
是
决定统计信息被锁定时的行为。如果为true,则即使表的统计信息被锁定,该过程也会将其删除。默认为false。
stat_category
VARCHAR2
是
暂不支持此参数。
- 要调用此过程删除表的统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 如果cascade_columns或cascade_indexes设置为true,则是否级联删除对应分区列或索引的统计信息,也由cascade_parts决定。比如,如果cascade_parts设置为true,则对于一个分区表,不仅将其所有分区的表级统计信息删除,也会将所有分区的列级、索引级统计信息删除。
- 删除表的统计信息等同于将表统计信息的reltuples、relpages和relallvisible信息置零。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 删除表级索引统计信息与删除索引统计信息类似,此处仅展示接口调用方式,具体示例参考DBE_STATS.DELETE_INDEX_STATS示例。 -- 删除表级统计信息,同时将该表的所有列、索引统计信息进行删除。 gaussdb=# CALL DBE_STATS.DELETE_TABLE_STATS(ownname => 'dbe_stats_delete_schema', tabname => 't2', cascade_columns => true, cascade_indexes => true); delete_table_stats -------------------- (1 row)
- DBE_STATS.DELETE_SCHEMA_STATS
删除schema下所有的表级、索引级和列级统计信息。该接口无返回值。
DBE_STATS.DELETE_SCHEMA_STATS的函数原型为:
DBE_STATS.DELETE_SCHEMA_STATS ( ownname VARCHAR2, stattab VARCHAR2 DEFAULT NULL, statid VARCHAR2 DEFAULT NULL, statown VARCHAR2 DEFAULT NULL, no_invalidate BOOLEAN DEFAULT NULL, force BOOLEAN DEFAULT FALSE, stat_category VARCHAR2 DEFAULT NULL );
表31 DBE_STATS.DELETE_SCHEMA_STATS接口参数说明 参数
类型
是否允许为空
描述
ownname
VARCHAR2
否
schema名字。如果设置为null,则默认使用当前schema。
stattab
VARCHAR2
是
暂不支持此参数。
statid
VARCHAR2
是
暂不支持此参数。
statown
VARCHAR2
是
暂不支持此参数。
no_invalidate
BOOLEAN
是
暂不支持此参数。
force
BOOLEAN
是
决定统计信息被锁定时的行为。如果为true,则即使有统计信息被锁定,该过程也会将其删除。默认为false。
stat_category
VARCHAR2
是
暂不支持此参数。
- 要调用此过程删除统计信息,需要对指定的表具有同ANALYZE命令一样的权限,具体可以参考ANALYZE | ANALYSE。
- 删除schema下的统计信息,即删除当前用户在指定schema下所有有权限的表,对于没有权限的表直接跳过,不报错。
- 当ownname参数值设置为null时使用当前schema,需将behavior_compat_options参数值设置为bind_procedure_searchpath。
示例:
-- 此处仅展示接口调用,具体实现用例参考DBE_STATS.DELETE_TABLE_STATS。 gaussdb=# CALL DBE_STATS.DELETE_SCHEMA_STATS(ownname => 'dbe_stats_delete_schema'); delete_schema_stats --------------------- (1 row)