注册
达梦dm8数据库update慢性能优化
培训园地/ 文章详情 /

达梦dm8数据库update慢性能优化

zxlin 2023/05/19 1723 0 0

问题现象描述
在数据库进行主键更新操作时,数据规模从2万条增加到11万条后,每条操作的耗时从0.3ms增加到30ms,导致更新操作的效率明显下降。
数据库基本信息
image.png
问题现象
image.png

统计信息分析
--获取表统计信息
(
SELECT C.TABLE_NAME AS"表名/索引名",B.NAME AS"列名",DECODE(T_FLAG,'I','索引名','C','列')AS"统计对象",
T_TOTAL AS"表行数",N_SMAPLE AS"采样行数",N_DISTINCT AS"列唯一值",N_NULL AS"列空值",LAST_GATHERED AS"最近收集时间"
FROM SYSSTATS A,(SELECT ID,NAME FROM SYSOBJECTS) B,(SELECT TABLE_NAME,INDEX_NAME FROM ALL_INDEXES
WHERE TABLE_NAME='DL_CUST_STOCK_FEE') C
WHERE A.ID=B.ID
AND B.NAME=C.INDEX_NAME
)
UNIONALL
(
SELECT B.NAME AS"表名",C.NAME AS"列名",DECODE(T_FLAG,'I','索引名','C','列')AS"统计对象",
T_TOTAL AS"表行数",N_SMAPLE AS"采样行数",N_DISTINCT AS"列唯一值",N_NULL AS"列空值",LAST_GATHERED AS"最近收集时间"
FROM SYSSTATS A,(SELECT ID,
NAME
FROM SYSOBJECTS
WHERE SCHID IN(SELECT ID FROM SYSOBJECTS WHERE NAME='CORE'AND TYPE$='SCH')) B ,SYSCOLUMNS C
WHERE A.ID=B.ID AND C.ID=A.ID AND A.COLID=C.COLID AND B.NAME='DL_CUST_STOCK_FEE'
);
未更新统计信息
image.png
SQL分析
image.png
执行计划显示,根据主键联合索引扫描定位数据更新
数据库结构问题
此表只存在一个主键索引INDEX33579704,前导列为sec_feeid ,mkcode_(一般数据库扫描前导列优先级大于其他列),执行计划根据此索引定位数据,没有问题;
数据分布问题
根据统计信息判定,数据迁移后,数据规模从2w变成11w,但是没有更新统计信息;
同时,数据分布发生变化,原先sec_feeid ,mkcode_(32,6)变为(423,6);

解决方案
数据库结构调整
将主键前导列做调整,并将表的主键定义为聚集索引(Clustered Primary Key),聚集主键作用如下:
聚集索引是一种物理存储结构,它将表中的记录按照主键的顺序存储在磁盘上,因此,聚集主键可以为表中的数据提供一些优化和性能上的好处,包括:
1)提高查询性能:由于聚集主键将数据按照主键的顺序存储,因此,在使用主键或涉及主键的查询时,可以快速定位所需的数据页,减少磁盘I/O操作的次数,从而提高查询性能。
2)减少数据碎片:聚集主键的使用可以将相邻的行存储在相邻的数据页中,从而减少数据碎片,减少了数据库维护索引的开销,提高了数据库的性能。
3)支持覆盖索引扫描:在某些情况下,聚集主键可以为覆盖索引扫描提供帮助。如果查询只需要主键列,聚集主键可以直接从索引中读取数据,而无需再去访问数据页。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服