达梦统计信息收集

背景

统计信息是优化器的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。

收集统计信息或更新统计信息,是为了索引有更好的执行计划。

达梦的统计信息分为三类:表的统计信息、列的统计信息、索引的统计信息。

 

统计信息生成的过程分为三步:

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 已经使用的页数

 

 

注意:更新统计信息需要在业务低谷的时候去操作。因为在高峰操作可能导致业务瘫痪。

 

 

 


请使用浏览器的分享功能分享到微信等