注册
达梦数据库学习18:统计信息
技术分享/ 文章详情 /

达梦数据库学习18:统计信息

Hi70KG 2023/08/28 2670 0 0

统计信息

1、统计信息概述

统计信息主要是描述数据库中表和索引的大小数以及数据分布状况等的一类信息。比如:表的行数、块数、平均每行的大小、索引的高度、叶子节点数以及索引字段的行数等。

统计信息对于 CBO(基于代价的优化器)生成执行计划具有直接影响。例如在嵌套循环连接(链接)中需要选择小表作为驱动表,两个关联表哪个是小表完全取决于统计信息中记录的数据量信息。此外,访问一个表是否要走索引,关联查询能否采用其它关联方式等都是 CBO 基于统计信息确定的。因此,统计信息的准确是生成最优执行计划的必要前提。

2、收集统计信息

DM 收集统计信息的方法分为手动收集和自动收集。

2.1、手动收集

--收集指定用户下所有表所有列的统计信息: DBMS_STATS.GATHER_SCHEMA_STATS('OA_TEST',100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); --收集指定用户下所有索引的统计信息: DBMS_STATS.GATHER_SCHEMA_STATS('usename',1.0,TRUE,'FOR ALL INDEXED SIZE AUTO'); --或 收集单个索引统计信息: DBMS_STATS.GATHER_INDEX_STATS('OA_TEST','INX_OA_TEST_IP'); --收集指定用户下某表统计信息: DBMS_STATS.GATHER_TABLE_STATS('OA_TEST','TEST01',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO'); --收集某表某列的统计信息: STAT 100 ON table_name(column_name); STAT 100 ON OA_TEST.TEST01(ID);

注意

统计信息收集过程中将对数据库性能造成一定影响,避免在业务高峰期收集统计信息。

2.2、自动收集

DM 数据库支持统计信息的自动收集,当全表数据量变化超过设定阈值后可自动更新统计信息。

Copy--打开表数据量监控开关,参数值为 1 时监控所有表,2 时仅监控配置表 SP_SET_PARA_VALUE(1,'AUTO_STAT_OBJ',2); --设置 SYSDBA.T 表数据变化率超过 15% 时触发自动更新统计信息 DBMS_STATS.SET_TABLE_PREFS('SYSDBA','T','STALE_PERCENT',15); --配置自动收集统计信息触发时机 SP_CREATE_AUTO_STAT_TRIGGER(1, 1, 1, 1,'14:36', '2020/3/31',60,1); /* 函数各参数介绍 SP_CREATE_AUTO_STAT_TRIGGER( TYPE INT, --间隔类型,默认为天 FREQ_INTERVAL INT, --间隔频率,默认 1 FREQ_SUB_INTERVAL INT, --间隔频率,与 FREQ_INTERVAL 配合使用 FREQ_MINUTE_INTERVAL INT, --间隔分钟,默认为 1440 STARTTIME VARCHAR(128), --开始时间,默认为 22:00 DURING_START_DATE VARCHAR(128), --重复执行的起始时间,默认 1900/1/1 MAX_RUN_DURATION INT, --允许的最长执行时间(秒),默认不限制 ENABLE INT --0 关闭,1 启用 --默认为 1 ); */

2.3、查看统计信息

--用于经过 GATHER_TABLE_STATS、GATHER_INDEX_STATS 或 GATHER_SCHEMA_STATS 收集之后展示。 dbms_stats.table_stats_show('模式名','表名'); --用于经过 GATHER_TABLE_STATS、GATHER_INDEX_STATS 或 GATHER_SCHEMA_STATS 收集之后展示。 返回两个结果集:一个是索引的统计信息;另一个是直方图的统计信息。 dbms_stats.index_stats_show('模式名','索引名'); –用于经过 GATHER_TABLE_STATS、GATHER_INDEX_STATS 或 GATHER_SCHEMA_STATS 收集之后展示。 dbms_stats.COLUMN_STATS_SHOW('模式名','表名','列名');

2.4、更新统计信息

--更新已有统计信息 DBMS_STATS.UPDATE_ALL_STATS();

2.5、删除统计信息

--表 DBMS_STATS.DELETE_TABLE_STATS('模式名','表名','分区名',...); --模式 DBMS_STATS.DELETE_SCHMA_STATS('模式名','','',...); --索引 DBMS_STATS.DELETE_INDEX_STATS('模式名','索引名','分区表名',...); --字段 DBMS_STATS.DELETE_COLUMN_STATS('模式名','表名','列名','分区表名',...);

达梦社区技术https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服