在线excel表格助力企业高效管理与数据分析的未来趋势
1300
2022-05-30
1 说明
1.1 背景介绍
DWS使用一段时间后会产生一定脏页数据,从性能、空间角度考虑需要对脏页空间进行释放。目前在以下几种情况出现概率较高,本文档主要为实际操作可能遇到的问题提供技术参考。
情况1:DWS任务多,包含临时表操作,导致脏页统计的视图运行报错。
情况2:DWS数据量大,使用默认系统视图统计脏页执行时间长。
1.2 VACUUM FULL介绍
VACUUM FULL一方面可以及时回收空间,一方面可以一定程度上提升数据库性能。
VACUUM FULL回收表中已经删除的行所占据的存储空间。在一般的数据库操作里,那些已经DELETE的行并没有从它们所属的表中物理删除,因此有必要周期地运行VACUUM FULL,特别是在经常更新的表上。
语法格式:VACUUM FULL ${tablename};
1.3 VACUUM FULL使用建议
VACUUM FULL 对现有DWS任务运行具有一定影响。建议从以下几个角度考虑:
u 系统表
针对系统表的操作比较危险,往往伴随着阻塞DWS正常任务或链接接入。附录的函数中已排除掉系统表的脏页统计。
建议:根据系统表大小(参考附录章节),半年~一年时间进行统计,若发现膨胀情况可协调窗口期做好业务暂停准备并进行释放。这里不做特别说明。
u 普通表
可单纯根据脏页率进行评估,决定是否需要进行释放;或通过脏页率+表大小配合方式评估,更有目的性进行释放。
建议:
1、首先建议确定系统运行压力较低的时间段,在该时间段内进行脏页统计,并根据脏页统计效果进行VACUUM FULL 维护操作。
2、其次建议根据系统数据更新频度,选取1~2月进行一次脏页统计。然后根据统计结果对这些表进行VACUUM FULL 操作。
3、最后建议获取系统脏页时配合表大小,规则自行拟定。如:脏页率超过20%、表大小*脏页率释放空间达到20GB 等等。
4、补充建议依照函数说明(附录章节),对视图数据进行固化(创建对应表)。这样可避免二次筛选时耗时过长,只需要对表进行筛选即可。
5、VACUUM FULL 操作建议根据系统压力进行调整,压力中等情况下可使用1~2个并发。无压力情况下可适当提升并发度。
u 索引
针对索引需要进行重建,这里不做过多说明。函数中已排除掉索引统计。
1.4 函数使用说明
1、创建函数及视图
DWS中根据附录脚本,创建funckang_get_dirty_tuples函数及v_get_dirty_tuples视图。需要注意视图中注释部分,自行决定是否保留。
2、对结果进行二次分析
使用step3步骤,将视图内容映射成物理表。然后对物理表进行规则筛选。
3、执行vacuum full
根据筛选出的schema名、table名 ,进行vacuum full 语句拼接,写入SQL文件。
4、执行vacuum full
确定时间时间段与并发度,通过 \parallel on ${number} 方式利用客户端并发执行。
1.5 改进后脏页统计方式与原有方式比较
序号
对比内容
1
CN+DN扫描
DN扫描
2
数据有效性
超过50%无效数据,其中包括'pg_toast','pg_catalog','information_schema'系统schema下危险表,以及索引信息
不统计系统表、索引信息
3
性能
基于6T数据测试,耗时610秒
基于6T数据测试,耗时14秒
4
成功率
统计中若任务使用临时表将导致统计报错
排除掉临时表统计,成功率更高
5
统计范围
统计非常全面,包括具体插入、删除、更新等一些列信息
从性能角度考虑仅提供脏页统计
6
稳定性
系统提供,经过测试
人工编写,未进行大量测试
2 原有脏页率统计方式说明
1. 查询 pgxc_get_stat_all_tables (view1)
注:视图可以获取脏页率。但其中包括插入、更新删除等许多统计信息,同时还需要与pg_namespace 关联。
↓
依赖
↓
2. pgxc_stat_all_tables(func1) 函数
注:函数自身循环遍历各个CN与DN上的信息,是个无法下推函数。
↓
依赖
↓
3. pg_catalog.pg_stat_all_tables(view2)
注:试图自身需要三个系统表关联,统计了很多与脏页自身无关的信息。
3 新重构脏页率统计方式说明
1、 funckang_get_dirty_tuples
注:函数自身只遍历DN上的表,同时去掉冗余信息 。通过v_get_dirty_tuples 视图计算表脏页信息,提供脏页率及表大小统计。
2、funckang_get_dirty_tuples_from_name
注:提供根据具体schemaname、tablename 方式返回具体的表的脏页信息。
3、使用说明
a、建议create table tbname as select * from vname方式将统计信息写入表中,后续可对表进行精确过滤或二次处理。
b、若单纯通过脏页率判定,则视图中不需要打开表大小统计。
c、若需要通过表大小*脏页率方式统计,则针对库内数据低于30T,可在视图中将大小信息一并统计,否则建议对单独统计表大小(建议:不要一次性查询,按照每个表单独进行统计,提升统计成功率)并形成另外一张表,然后将“脏页表”与“表大小统计表”进行关联计算。
4 附录
4.1 系统表大小统计
select
pt.schemaname
,pt.tablename
,getdistributekey(pt.schemaname||'."'||pt.tablename||'"') as distribute_key
,pg_size_pretty(pg_relation_size(pt.schemaname||'."'||pt.tablename||'"')) as tablesize
,case when pt.hasindexes = 't' then pg_size_pretty(pg_indexes_size(pt.schemaname||'."'||pt.tablename||'"')) else '' end as indexsize
,pc.reloptions
,pg_stat_get_last_analyze_time(pc.oid) as lastanalyze
,pg_stat_get_last_vacuum_time(pc.oid) as lastvacuum
,pc.parttype
from
pg_tables pt
,pg_class pc
where
(pt.schemaname||'."'||pt.tablename||'"')::regclass::oid=pc.oid and pt.schemaname not in ('mppdbpermission','information_schema','cstore','pg_catalog','pmk')
order by
pg_relation_size((pt.schemaname||'."'||pt.tablename||'"')) desc;
4.2 表大小逐项统计
SQL 文件拼接如下格式,对所有非系统表进行统计。对日志处理后导入数据库即可作为“表大小统计信息”表。
select pg_table_size(‘${schemanem}.${tablename}’);
select pg_table_size(‘${schemanem}.${tablename}’);
select pg_table_size(‘${schemanem}.${tablename}’);
…
附件: zangye.zip 2.80KB 下载次数:4次
Gauss AP EI企业智能 数据仓库服务 GaussDB(DWS)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。