背景
统计信息是优化器的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。
收集统计信息或更新统计信息,是为了索引有更好的执行计划。
达梦的统计信息分为三类:表的统计信息、列的统计信息、索引的统计信息。
统计信息生成的过程分为三步:
1、确定采样的的数据:根据对象去分析数据 (表:计算表的行数、所占的页数目、平均记录长度、列:统计列数据的分布情况、索引:统计索引列的数据分布情况)
2、确定采样率:根据数据对象的大小,通过内部算法,确定数据的采样率。采样率与数据量成反比。
3、生成直方图:频率的直方图、等高直方图。
达梦数据库统计信息的使用
1、更新统计信息
----更新统计信息(模式T11下的所有对象)
dbms_stats.GATHER_SCHEMA_stats ('T11');
----更新统计信息(模式T11下的表T11)
dbms_stats.GATHER_TABLE_STATS ('T11','T11');
----更新统计信息(模式T11下的索引IDX_T11_ID)
dbms_stats.GATHER_INDEX_STATS('T11','IDX_T11_ID');
2、查看统计信息
----查看统计信息(模式T11下的表T11)
dbms_stats.TABLE_STATS_SHOW('T11','T11');
----查看统计信息(模式T11下的索引IDX_T11_ID)
dbms_stats.INDEX_STATS_SHOW('T11','IDX_T11_ID');
----查看统计信息(模式T11下的表T11下的列ID)
dbms_stats.COLUMN_STATS_SHOW('T11','T11','ID');
3、删除统计信息
----删除统计信息(模式T11下)
dbms_stats.DELETE_SCHEMA_STATS('T11','T11');
----删除统计信息(模式T11下的表T11)
dbms_stats.DELETE_TABLE_STATS('T11','T11');
----删除统计信息(模式T11下的索引IDX_T11_ID)
dbms_stats.DDELETE_INDEX_STATS('T11','IDX_T11_ID');
----删除统计信息(模式T11下的表T11下的列ID)
dbms_stats.DELETE_COLUMN_STATS('T11','T11','ID');
4、更新统计信息
----更新已有的统计信息
dbms_stats.UPDATE_ALL_STATS();
哪些对象不支持统计信息
1、外部表、DBLINK远程表 、动态视图表、临时表。
2、所在表空间为OFFLINE的对象。
3、位图索引、全文索引
4、数据类型:blob image clob text… 也不支持 自定义类型和空间类型也不支持。
测试案例
--第一次使用这DBMS_STATS包需要初始化:
sp_create_system_packages(1,'DBMS_STATS');
--创建一张表 写入数据来获取它的统计信息。
CREATE TABLE TEST.T5 (ID INT,NAME VARCHAR(20));
--插入数据到表T5中
BEGIN
FOR I IN 1..999 LOOP
INSERT INTO TEST.T5 VALUES(I,'AAA'||I);
END LOOP;
commit;
END;
--使用 table_stats_show 获取表的统计信息:
-- TEST是模式名, T5是表名
BEGIN
DBMS_STATS.table_stats_show('TEST','T5');
END;
--发现结果为空, 是因为没有收集统计信息;
--使用 GATHER_TABLE_STATS 来收集T5这张表的统计信息:
BEGIN
DBMS_STATS.GATHER_TABLE_STATS('TEST','T5') ;
END;
--字段解释:
NUM_ROWS 记录表的行数
LEAF_BLCOKS 记录表的总页数
LEAF_USED_BLOCKS 已经使用的页数
注意:更新统计信息需要在业务低谷的时候去操作。因为在高峰操作可能导致业务瘫痪。