greenplum 单表磁盘空间持续高速增长,解决办法(2)

描述

自上次解决空间增长问题后,又出现了此问题。初步解决方案还是上次的步骤,但是感觉治标不治本,这不是个办法,而且只有一张或两张表有这个问题。

这样就有了一个排查的入手点了。是因为频繁的插入删除么,还是频繁的更新新呢?

  1. GP物理空间使用的特性建议去了解一下
  2. 简单介绍一下,就是修改的动作,是逻辑删除,空间不释放
  3. 运行一段时间后有修改的表,需要进行真空处理

发现其中一张表是有删除、插入动作,另一张表只有插入动作。尝试了一下 真空还能释放空间,这就比较郁闷了。没有进行逻辑删除,那释放的空间是什么呢?

原因

排查后发现,两张表都有一个特点就是批量写入失败 重试。。。。

  1. 复杂的多表关联查询,然后写入汇总表
  2. 关联查询的同时,某些数据是异步的,拿不到
  3. 生成的数据对应汇总表的字段,有些异步字段是分布键

 

  1. 上游接口变更没有通知下游
  2. 比如类型变更,长度变更

以上情况导致了批量写入失败。

分析

以上情况分析原因,可能是在插入数据之前,会先在各个节点上申请足量的空间,比如数据,索引、静态分析等。

申请到空间后才会写入,但是写入失败了,空间也没有进行回收操作。这时程序触发的重试操作,没有回收的空间也不会再次 被分配,而是分配新的空间给到请求。

就导致了大量的闲置空间。

后果

线上使用到这种表的代码,会逐渐卡顿,温水煮蛙啊,等意识到卡顿的时候,去看表的大小 ,就几十个G了。如果是那种PV较高的平台,不回会让你有时间去停服处理的。只能用方案一种的方法。

如果必须要查询的情况下,就必须在临时表 生成对应条件的数据了,可能时间就比较紧迫了。

以上仅为个人观点,如有错误欢迎指正

 

### C++ 中处理 ISBN 号码的方法 #### 验证 ISBN 的有效性 为了验证一个给定的 ISBN 是否有效,可以采用加权求和的方式计算校验位。对于长度为13的标准ISBN(即带有前缀),可以通过下面的算法来检验: - 对于每本书籍对应的 ISBN 编号,除去最后一位作为识别码外,其余各位数字分别乘以权重因子(位置奇数则权重为1,偶数则为3),再将这些积相加以获得总和。 - 将上述得到的结果除以10取余数,并用10去减这个余数得出最终应该有的识别码。 如果实际给出的识别码等于通过此方法算出来的理论值,则说明该ISBN是有效的;反之则是无效的[^4]。 ```cpp bool isValidISBN(const std::string& isbn){ int sum = 0; for(int i=0; i<isbn.length()-1;i++){ if(isbn[i]!='-' && (isbn[i]<'0'||isbn[i]>'9')){ return false; } if(i%2==0){ sum += isbn[i]-'0'; }else{ sum += 3*(isbn[i]-'0'); } } char lastDigit = '0' + (10-(sum % 10))%10; return isbn.back() == lastDigit || isbn.back()=='X'&&lastDigit=='0'+10; } ``` #### 处理并修正错误的 ISBN 输入 当接收到可能不正确的 ISBN 输入时,程序应当尝试纠正它。这通常涉及到移除非数字字符以及调整到合适的格式。一旦清理完毕后,就可以应用前面提到的有效性检查逻辑来进行验证。如果不匹配,则可以根据已知规则推测最有可能正确的版本[^2]。 ```cpp std::string correctISBN(std::string inputIsbn){ // Remove all non-digit characters except the final check digit. auto newEnd = std::remove_if(inputIsbn.begin(),inputIsbn.end(), [](char c){return !isdigit(c)&&c!='X';}); *newEnd='X';// Assume X as placeholder for unknown value while(newEnd!=inputIsbn.end()){ *(newEnd--)=(isValidISBN(inputIsbn))?(*(newEnd)):((*(newEnd)=='X')?('0'):('X')); } // Ensure proper formatting with hyphens at positions 1 and 5 from end. inputIsbn.insert(inputIsbn.size()-4,"-"); inputIsbn.insert(inputIsbn.size()-9,"-"); return inputIsbn; } ``` 以上代码片段展示了如何在C++中实现基本的ISBN验证功能及其纠错机制。需要注意的是这里假设了未知情况下最后一个可能是‘X’的情况,实际情况可能会更复杂一些取决于具体应用场景的要求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值