#DBMS_STATS
DBMS_STATS包提供了一组变量、函数和存储过程,用于管理优化器的统计信息。
# 手动设置统计信息
# SET_TABLE_STATS
DBMS_STATS.SET_TABLE_STATS (
ownname VARCHAR,
tabname VARCHAR,
partname VARCHAR,
numrows NUMBER,
numblks NUMBER,
avgrlen NUMBER
);
此存储过程用于手动设置表/AC或者分区的统计信息,旧的统计信息将会被覆盖,主要在测试需要或者统计信息修正场景中使用。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表/AC名 |
partname | 分区名 |
numrows | 表/AC或者分区的行数 |
numblks | 表/AC或者分区的数据块数 |
avgrlen | 表/AC或者分区的平均行长度 |
示例
BEGIN
DBMS_STATS.SET_TABLE_STATS( 'SALES', 'SALES_INFO', 'P_SALES_INFO_1', 10, 1, 15);
END;
/
# SET_INDEX_STATS
DBMS_STATS.SET_INDEX_STATS (
ownname VARCHAR,
indname VARCHAR,
partname VARCHAR,
numrows NUMBER,
numlblks NUMBER,
numdist NUMBER,
numfirstdist NUMBER,
avglblk NUMBER,
avgdblk NUMBER,
clstfct NUMBER,
indlevel NUMBER
);
此存储过程用于手动设置索引或者分区的统计信息,旧的统计信息将会被覆盖,主要在测试需要或者统计信息修正场景中使用。
参数 | 描述 |
---|---|
ownname | 用户名 |
indname | 索引名 |
partname | 索引分区名 |
numrows | 索引键个数 |
numlblks | 叶子块个数 |
numdist | 索引键唯一值个数 |
numfirstdist | 组合索引第一列的键唯一值个数 |
avglblk | 平均每个叶子块包含键的个数 |
avgdblk | 平均每个叶子块指向数据块的个数 |
clstfct | 索引的聚集因子 |
level | BTree的高度 |
示例
CREATE INDEX idx_sales_info_2 ON sales_info (year) LOCAL;
SELECT PARTITION_NAME FROM DBA_IND_PARTITIONS
WHERE index_name='IDX_SALES_INFO_2';
PARTITION_NAME
---------------------------
SYS_P63
SYS_P64
SYS_P65
BEGIN
DBMS_STATS.SET_INDEX_STATS('SALES', 'IDX_SALES_INFO_2', 'SYS_P63', 100, 10, 10, 1, 10, 10, 1, 1);
END;
/
# SET_COLUMN_STATS
DBMS_STATS.SET_COLUMN_STATS (
ownname VARCHAR,
tabname VARCHAR,
colname VARCHAR
partname VARCHAR,
distinct NUMBER,
density NUMBER,
nullcnt NUMBER,
avgclen NUMBER,
);
此存储过程用于手动设置表/AC或者分区的列统计信息,旧的统计信息将会被覆盖,主要在测试需要或者统计信息修正场景中使用。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表/AC名 |
colname | 列名 |
partname | 分区名 |
distinct | 列distinct数量 |
density | 列density,取值范围为[0,1] |
nullcnt | 列NULL值数量 |
avgclen | 平均列长度 |
示例
BEGIN
DBMS_STATS.SET_COLUMN_STATS( 'SALES', 'SALES_INFO', 'AMOUNT', 'P_SALES_INFO_1', 10, 0.2, 15, 10);
END;
/
# 删除统计信息
# DELETE_COLUMN_STATS
DBMS_STATS.DELETE_COLUMN_STATS (
ownname VARCHAR,
tabname VARCHAR,
colname VARCHAR
partname VARCHAR,
type VARCHAR
);
此存储过程用于手动删除列的统计信息,主要在清理不准确的统计信息场景中使用。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表/AC名 |
colname | 列名 |
partname | 分区名 |
type | 删除类型('ALL':同时删除column统计信息和直方图,'HISTOGRAM':只删除直方图) |
示例:
BEGIN
DBMS_STATS.DELETE_COLUMN_STATS('SALES', 'SALES_INFO', 'AMOUNT', 'P_SALES_INFO_1', 'HISTOGRAM ');
END;
/
# 收集统计信息
# GATHER_TABLE_STATS
DBMS_STATS.GATHER_TABLE_STATS (
ownname VARCHAR,
tabname VARCHAR,
partname VARCHAR,
estimate_percent NUMBER,
block_sample BOOLEAN,
method_opt VARCHAR,
degree NUMBER,
granularity VARCHAR,
cascade BOOLEAN
);
此存储过程用于收集表/AC或分区的统计信息。
对于组合分区表,暂不支持指定收集某个分区/子分区,仅收集其GLOBAL级统计信息。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表/AC名 |
partname | 分区名 |
estimate_percent | 采样率,见统计信息选项说明 |
block_sample | 是否采用块级采样 |
method_opt | 列统计信息选项,见统计信息选项说明 |
degree | 并行度,对于大表增大并行度可以提升统计信息收集的效率,见统计信息选项说明 |
granularity | 分区统计粒度,见统计信息选项说明 |
cascade | 是否收集索引统计信息,见统计信息选项说明 |
示例
BEGIN
DBMS_STATS.GATHER_TABLE_STATS('SALES', 'SALES_INFO', 'P_SALES_INFO_1', 0.2, FALSE, 'FOR ALL COLUMNS SIZE AUTO', 4, 'AUTO', TRUE);
END;
/
# GATHER_INDEX_STATS
DBMS_STATS.GATHER_INDEX_STATS (
ownname VARCHAR,
indname VARCHAR,
partname VARCHAR,
estimate_percent NUMBER,
degree NUMBER,
granularity VARCHAR,
);
此存储过程用于收集索引或索引分区的统计信息。
对于组合分区索引,暂不支持指定收集某个分区/子分区,仅收集其GLOBAL级统计信息。
参数 | 描述 |
---|---|
ownname | 用户名 |
indname | 索引名 |
partname | 索引分区名,NULL表示统计所有分区 |
estimate_percent | 采样率百分比,见统计信息选项说明 |
degree | 并行度,见统计信息选项说明 |
granularity | 分区统计粒度,见统计信息选项说明 |
示例
CREATE INDEX idx_sales_info_2 ON sales_info (year) LOCAL;
BEGIN
DBMS_STATS.GATHER_INDEX_STATS('SALES', 'IDX_SALES_INFO_2', '', 0.2, 2,'ALL');
END;
/
# GATHER_SCHEMA_STATS
DBMS_STATS.GATHER_SCHEMA_STATS (
ownname VARCHAR,
estimate_percent NUMBER,
block_sample BOOLEAN,
method_opt VARCHAR,
degree NUMBER,
granularity VARCHAR,
cascade BOOLEAN
);
此存储过程用于收集指定用户下所有对象(表、AC、列、索引)的统计信息。
参数 | 描述 |
---|---|
ownname | 用户名 |
estimate_percent | 采样率百分比,见统计信息选项说明 |
block_sample | 是否采用块级采样 |
method_opt | 列统计信息选项,见统计信息选项说明 |
degree | 并行度,见统计信息选项说明 |
granularity | 分区统计粒度,见统计信息选项说明 |
cascade | 是否收集索引统计信息,见统计信息选项说明 |
exec DBMS_STATS.GATHER_SCHEMA_STATS('SALES', 1, TRUE, 'FOR ALL COLUMNS SIZE AUTO', 1, 'ALL', TRUE);
# GATHER_DATABASE_STATS
DBMS_STATS.GATHER_DATABASE_STATS (
options VARCHAR,
estimate_percent NUMBER,
degree NUMBER,
method_opt VARCHAR,
granularity VARCHAR,
cascade BOOLEAN,
gather_sys BOOLEAN
);
此存储过程用于收集数据库的统计信息。
参数 | 描述 |
---|---|
options | 见统计信息选项说明 |
estimate_percent | 采样率,见统计信息选项说明 |
degree | 并行度,见统计信息选项说明 |
method_opt | 列统计信息选项,见统计信息选项说明 |
granularity | 分区统计粒度,见统计信息选项说明 |
cascade | 是否收集索引统计信息,见统计信息选项说明 |
gather_sys | 是否收集系统表的统计信息 |
示例
exec DBMS_STATS.GATHER_DATABASE_STATS('GATHER AUTO', 1, 2, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, FALSE);
# FLUSH_DATABASE_MONITORING_INFO
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
此存储过程用于持久化表/AC的变化信息。
示例
exec DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
# 锁定/解锁统计信息
# LOCK_PARTITION_STATS
DBMS_STATS.LOCK_PARTITION_STATS (
ownname VARCHAR,
tabname VARCHAR,
partname VARCHAR
);
此存储过程用于锁定表中某个表分区的统计信息,锁定后该分区的统计信息不再被修改。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表名 |
partname | 分区名 |
示例
exec DBMS_STATS.LOCK_PARTITION_STATS('SALES', 'SALES_INFO', 'P_SALES_INFO_1');
# LOCK_TABLE_STATS
DBMS_STATS.LOCK_TABLE_STATS (
ownname VARCHAR,
tabname VARCHAR
);
此存储过程用于锁定某张表的统计信息,锁定后该表的统计信息不再被修改。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表名 |
示例
exec DBMS_STATS.LOCK_TABLE_STATS('SALES', 'SALES_INFO');
# LOCK_SCHEMA_STATS
DBMS_STATS.LOCK_PARTITION_STATS (
ownname VARCHAR
);
此存储过程用于锁定某个schema下所有表的统计信息,锁定后该schema下所有表的统计信息不再被修改,但该schema下在此之后新建的表并不锁定。
参数 | 描述 |
---|---|
ownname | 用户名 |
示例
exec DBMS_STATS.LOCK_SCHEMA_STATS('SALES');
# UNLOCK_PARTITION_STATS
DBMS_STATS.UNLOCK_PARTITION_STATS (
ownname VARCHAR,
tabname VARCHAR,
partname VARCHAR
);
此存储过程用于解锁表中某个表分区的统计信息。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表名 |
partname | 分区名 |
示例
exec DBMS_STATS.UNLOCK_PARTITION_STATS('SALES', 'SALES_INFO', 'P_SALES_INFO_1');
# UNLOCK_TABLE_STATS
DBMS_STATS.UNLOCK_TABLE_STATS (
ownname VARCHAR,
tabname VARCHAR
);
此存储过程用于解锁某张表的统计信息。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表名 |
示例
exec DBMS_STATS.UNLOCK_TABLE_STATS('SALES', 'SALES_INFO');
# UNLOCK_SCHEMA_STATS
DBMS_STATS.UNLOCK_SCHEMA_STATS (
ownname VARCHAR
);
此存储过程用于解锁某个schema下所有表的统计信息。
参数 | 描述 |
---|---|
ownname | 用户名 |
示例
exec DBMS_STATS.UNLOCK_SCHEMA_STATS('SALES');
# 设置统计信息选项
在调用统计信息收集程序时,YashanDB提供一系列选项,如分区粒度、采样率等,供用户指定,以获取更精准可用的数据,这些选项的值可通过如下三种方式设置:
- 作为收集程序的参数,在调用时指定,此种方式优先级最高。
- 通过SET_*_PREFS程序进行通用设定,当未指定选项参数,或选项参数为NULL时,系统使用此通用设定值。
- 当未按上述两种方式指定值时,由系统给出默认值。
其中,某个选项一旦由SET_*_PREFS程序设定,即可通过ALL_TAB_STAT_PREFS、DBA_TAB_STAT_PREFS、USER_TAB_STAT_PREFS视图查看该选项在表上对应的值。
下表列示这些选项:
选项 | 含义 | 系统默认值 |
---|---|---|
STALE_PERCENT | 统计信息失效的变化率阈值 | 0.1 |
CASCADE | 收集表的统计信息时,是否一并收集索引的统计信息 | FALSE |
DEGREE | 统计信息收集的并行度 | 1 |
ESTIMATE_PERCENT | 采样率,取值为0或者在[0.0001-1]之内。当取值为0时,将由数据库自动决定采样率。 | 1 |
GRANULARITY | 分区表收集策略 1. ALL:收集表和分区 2. GLOBAL:只收集表 3. GLOBAL AND PARTITION:收集表和分区 4. PARTITION:只收集分区 5. SUBPARTITION:保留选项。只收集子分区 6. AUTO:由分区的类型自动决定 | GLOBAL |
METHOD_OPT | 统计信息收集选项 1. FOR ALL COLUMNS [size_clause]:收集所有列的统计信息 2. FOR COLUMNS [column_clause] [size_clause]:收集指定列的统计信息 column_clause:(col1,col2,col3) size_clause:SIZE {integer | AUTO}用于指定直方图信息 1. integer:直方图的bucket数量,范围为[1, 2048] 2. AUTO:由数据库决定是否生成直方图 SET_SCHEMA_PREFS、SET_DATABASE_PREFS、SET_GLOBAL_PREFS只能设置FOR ALL COLUMNS [size_clause]。 | FOR ALL COLUMNS SIZE AUTO |
OPTIONS | 数据库统计信息收集选项 1. GATHER:收集所有表的统计信息 2. GATHER AUTO:默认选项,由数据库决定收集的表 3. GATHER STALE:只收集无效的统计信息 4. GATHER EMPTY:只收集空的统计信息 该选项仅能通过SET_GLOBAL_PREFS设置。 | GATHER AUTO |
# SET_TABLE_PREFS
DBMS_STATS.SET_TABLE_PREFS (
ownname VARCHAR,
tabname VARCHAR,
pname VARCHAR,
pvalue VARCHAR
);
此存储过程用于设置表的统计信息选项,方便用户控制表的统计信息收集、失效等行为。
参数 | 描述 |
---|---|
ownname | 用户名 |
tabname | 表名 |
pname | 统计信息选项名 |
pvalue | 统计信息选项值 |
示例
exec DBMS_STATS.SET_TABLE_PREFS('SALES', 'SALES_INFO', 'DEGREE', '4');
# SET_SCHEMA_PREFS
DBMS_STATS.SET_SCHEMA_PREFS (
ownname VARCHAR,
pname VARCHAR,
pvalue VARCHAR
);
此存储过程用于设置schema下当前所有表的统计信息选项,对后续新建的表不生效。
参数 | 描述 |
---|---|
ownname | 用户名 |
pname | 统计信息选项名 |
pvalue | 统计信息选项值 |
示例
exec DBMS_STATS.SET_SCHEMA_PREFS('SALES', 'DEGREE', '4');
# SET_DATABASE_PREFS
DBMS_STATS.SET_DATABASE_PREFS (
pname VARCHAR,
pvalue VARCHAR,
add_sys BOOLEAN
);
此存储过程用于设置数据库下当前所有表的统计信息选项,对后续新建的表不生效。
参数 | 描述 |
---|---|
pname | 统计信息选项名 |
pvalue | 统计信息选项值 |
add_sys | 是否设置SYS用户下表的统计信息选项,默认为FALSE |
示例
exec DBMS_STATS.SET_DATABASE_PREFS('DEGREE', '4', FALSE);
# SET_GLOBAL_PREFS
DBMS_STATS.SET_GLOBAL_PREFS (
pname VARCHAR,
pvalue VARCHAR
);
此存储过程用于设置全局的统计信息选项,对现有没有设置该选项的表和后续新建的表生效。
参数 | 描述 |
---|---|
pname | 统计信息选项名 |
pvalue | 统计信息选项值 |
示例
exec DBMS_STATS.SET_GLOBAL_PREFS('DEGREE', '4');