DWS数据脏页统计及空间回收介绍

网友投稿 1318 2022-05-30

1       说明

1.1       背景介绍

DWS使用一段时间后会产生一定脏页数据,从性能、空间角度考虑需要对脏页空间进行释放。目前在以下几种情况出现概率较高,本文档主要为实际操作可能遇到的问题提供技术参考。

情况1:DWS任务多,包含临时表操作,导致脏页统计的视图运行报错。

情况2:DWS数据量大,使用默认系统视图统计脏页执行时间长。

1.2       VACUUM FULL介绍

VACUUM FULL一方面可以及时回收空间,一方面可以一定程度上提升数据库性能。

VACUUM FULL回收表中已经删除的行所占据的存储空间。在一般的数据库操作里,那些已经DELETE的行并没有从它们所属的表中物理删除,因此有必要周期地运行VACUUM FULL,特别是在经常更新的表上。

DWS数据脏页统计及空间回收介绍

语法格式: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小时内删除侵权内容。

上一篇:Excle表格如何加网格线?
下一篇:Linux开发_采用线程处理网络请求
相关文章