DM 统计信息

本文详细介绍了达梦数据库中统计信息的作用、收集方法及约束,包括使用存储过程和DBMS_STATS包进行表、列、索引统计信息的初始化、查询和删除。统计信息对于优化器选择执行计划至关重要,确保数据存储描述的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 统计信息

统计信息描述数据是如何在数据库中存储的,是优化器的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。
DM数据库没有自动收集统计信息功能,一般情况下使用手动执行存储过程和系统包中的方法来收集,不推荐系统稳定运行后再去更新统计信息。
DM数据库可通过执行系统存储过程收集统计信息,使用DBMS_STATS包(可兼容Oracle数据库)可收集和获取统计信息。

1.1 使用存储过程

使用存储过程可收集的统计信息包括:表统计信息、列统计信息、索引统计信息。
(1)表级基本信息收集,使用SP_TAB_STAT_INIT, 如:
SQL>SP_TAB_STAT_INIT(‘SYSDBA’, ‘T1’);

(2)列级信息收集,使用SP_COL_STAT_INIT, 如:
SQL>SP_COL_STAT_INIT(‘SYSDBA’, ‘T1’, ‘ID’);
//收集t1表id字段统计信息
SQL>SP_TAB_COL_STAT_INIT (‘SYS’, ‘SYSOBJECTS’);
//收集SYS模式下SYSOBJECTS所有列统计信息

(3)索引信息收集,使用SP_INDEX_STAT_INIT, 如:
SQL>SP_INDEX_STAT_INIT(‘SYSDBA’, ‘T1L02’);
//对表上所有索引生成统计信息
SQL>SP_DB_STAT_INIT ();
SP_INDEX_STAT_INIT(‘SYSDBA’,‘INDEX_ID’);
stat 100 on index INDEX_ID;
//对库上所有模式下的所有用户表上的所有索引生成统计信息

(4)对某个SQL查询语句中涉及的所有表和过滤条件中的列(不包括大字段、ROWID)生成统计信息,如:
SQL>SP_SQL_STAT_INIT(‘SELECT * FROM T1, T2’);
(5)查询表的统计信息:
begin
dbms_stats.TABLE_STATS_SHOW(‘SYSDBA’,‘T1’);
end;
/
表的统计信息,格式如下:
名称 说明
NUM_ROWS 表的总行数
LEAF_BLOCKS 总的页数
LEAF_USED_BLOCKS 已经使用的页数

(6)删除统计信息,如:
SQL>SP_TAB_STAT_DEINIT(‘SYSDBA’, ‘T1’);//删除表的统计信息

(7)收集模式下对象的统计信息
使用DBMS_STATS 首先得调用一个系统存储过程来创建这个包:
收集SYSDBA模式下对象的统计信息。
SP_CREATE_SYSTEM_PACKAGES(1);
DBMS_STATS.GATHER_SCHEMA_STATS(‘SYSDBA’,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’);
示例:收集BAOBIAO模式下对象的统计信息
DBMS_STATS.GATHER_SCHEMA_STATS(‘BAOBIAO’,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’);

1.2 使用DBMS_STATS包

可通过执行存储过程SP_CREATE_SYSTEM_PACKAGES(1)创建DBMS_STATS包。该系统包中通过以下方法来收集、获取统计信息(具体函数参数及含义见DM_SQL.pdf):
COLUMN_STATS_SHOW //根据模式名,表名和列名获得该列的统计信息
TABLE_STATS_SHOW //根据模式名,表名获得该表的统计信息
INDEX_STATS_SHOW //根据模式名,索引名获得该索引的统计信息
GATHER_TABLE_STATS //根据设定的参数,收集表的统计信息
GATHER_INDEX_STATS //根据设定的参数,收集索引的统计信息
GATHER_SCHEMA_STATS //收集模式下对象的统计信息
DELETE_TABLE_STATS //根据设定参数,删除与表相关对象的统计信息
DELETE_SCHEMA_STATS //根据设定参数,删除模式下对象的统计信息
DELETE_INDEX_STATS //根据设定参数,删除索引的统计信息
DELETE_COLUMN_STATS //根据设定参数,删除列的统计信息
UPDATE_ALL_STATS //更新已有的统计信息
使用方法如下:
获得PERSON模式下表ADDRESS中列ADDRESSID的统计信息,如:
DBMS_STATS.COLUMN_STATS_SHOW(‘PERSON’,‘ADDRESS’,‘ADDRESSID’);

①、更新统计信息
dbms_stats.GATHER_SCHEMA_stats (‘SCHEMA_NAME’);
dbms_stats.GATHER_TABLE_STATS (‘SCHEMA_NAME’,‘TABLE_NAME’);
dbms_stats.GATHER_INDEX_STATS(‘SCHEMA_NAME’,‘INDEX_NAME’);

②、查看统计信息
dbms_stats.TABLE_STATS_SHOW(‘SCHEMA_NAME’,‘TABLE_NAME’);
dbms_stats.INDEX_STATS_SHOW(‘SCHEMA_NAME’,‘INDEX_NAME’);
dbms_stats.COLUMN_STATS_SHOW(‘SCHEMA_NAME’,‘TABLE_NAME’,‘COLUMN_NAME’);

③、删除统计信息
dbms_stats.DELETE_SCHEMA_STATS(‘SCHEMA_NAME’);
dbms_stats.DELETE_TABLE_STATS(‘SCHEMA_NAME’,‘TABLE_NAME’);
dbms_stats.DDELETE_INDEX_STATS(‘SCHEMA_NAME’,‘INDEX_NAME’);
dbms_stats.DELETE_COLUMN_STATS(‘SCHEMA_NAME’,‘TABLE_NAME’,‘COLUMN_NAME’);

④、更新统计信息
dbms_stats.UPDATE_ALL_STATS()

1.3 统计信息使用约束

以下对象不支持统计信息:
(1)外部表、临时表、REMOTE表、动态视图表、记录类型数组所用的临时表;
(2)所在表空间为OFFLINE的对象;
(3)位图索引,位图连接索引、虚索引、无效的索引、全文索引;
(4)BLOB、IMAGE、LONGVARBINARY、CLOB、TEXT、LONGVARCHAR、BOOLEAN等列类型。

达梦社区地址:https://eco.dameng.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值