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