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

举报
一条小胖子 发表于 2020/11/25 22:55:56 2020/11/25
【摘要】 1 说明1.1 背景介绍DWS使用一段时间后会产生一定脏页数据,从性能、空间角度考虑需要对脏页空间进行释放。目前在以下几种情况出现概率较高,本文档主要为实际操作可能遇到的问题提供技术参考。情况1:DWS任务多,包含临时表操作,导致脏页统计的视图运行报错。情况2:DWS数据量大,使用默认系统视图统计脏页执行时间长。1.2 VACUUM FULL介绍VACUU...

1       说明

1.1       背景介绍

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

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

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

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) 函数

注:函数自身循环遍历各个CNDN上的信息,是个无法下推函数。

 

                            

                            依赖

                            

 

3.    pg_catalog.pg_stat_all_tables(view2)

注:试图自身需要三个系统表关联,统计了很多与脏页自身无关的信息。

3       新重构脏页率统计方式说明

1 funckang_get_dirty_tuples

注:函数自身只遍历DN上的表,同时去掉冗余信息 。通过v_get_dirty_tuples 视图计算表脏页信息,提供脏页率及表大小统计。

 

2funckang_get_dirty_tuples_from_name

注:提供根据具体schemanametablename 方式返回具体的表的脏页信息。

 

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 下载次数:18
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。