收付费系统,不要问我表为什么设计成这样,传统IT行业有很多难处,所以表结构不能变,且不能用pl/sql。
表结构: 业务号、客户、金额、收付标识
原子操作粒度:需要 group by 业务号, 客户 , 并判断sum(收的金额) - sum(付的金额)如果正的为收费,负的为付费进行收付费。
其他说明:精简了表结构,还有其他复杂查询条件
现在问题来了,表的量级上亿。 有批处理一次处理100~200万条的数据,以group by之后5000条数据为一次事务。
批处理过程中,还有其他方式对这些数据进行收付。
求方案使得:
1. 批处理和其他方式不会有冲突(事务错乱),同时不会造成其他方式长时间卡顿。
2. 一次批处理时间在可接受范围内, 30分钟内能完成吧。
不用pl/sql,你是想用什么?
你表结构不能改, 又不能用plsql, 这个……
怎么就不能改呢, 加个字段会影响?
能改表结构,早就改了。
SB评审不通过, 相同的汇总表用了2个,无力吐槽
200园豆太少了,真的把这问题解决了,怎么也得2WRMB。
任何软件问题都可以通过加一层解决。你可以改变策略,把需要批处理的数据结转到一个表,然后处理完之后再把结果同步到之前的那个表结构不能改的主表上,多年前我搞过很多类似这种脏活累活...好的,园豆是我的了,谢谢。
一般是用冗余来解决你这些问题
及将历史数据和及时数据分离
先算出历史数据然后在加上你的及时数据 然后就是完整的数据
如果做的更好点 就是分维度了 按照数据的维度不同 冗余多张表 然后通过直接查询代替计算 来减少消耗
这个简单
SqlConnection con = new SqlConnection("连接串"); using (SqlTransaction tran = con.BeginTransaction()) { try { // group by 业务号, 客户 //取出5000条数据 for (int i = 0; i < 5000; i++) { //一个一个 判断sum(收的金额) - sum(付的金额)如果正的为收费,负的为付费进行收付费 // 组装 update语句 //设置 收付款标识 // 将操作过的数据 设置一个标声 //下次操作的时候 标志 继续操作 } tran.Commit(); } catch (Exception) { tran.Rollback(); } }
感谢各位的回答,因为不能冗余,不能加表。所以诸位的方案都无法采用。
最后我把所有的控制都放到内存, 针对ID进行哈希,并对哈希表做同步处理。
一次事务占用内存1M左右,可以接受
你说的不就是我的方案么
200是我的,哈哈哈哈
你采用了我的方案,你个骗子
@田麦成: 哥们,恕我直说, 你这是把大对象放到内存么。 我的方案和你这个一点都不沾边啊
@田麦成: 我说的控制是其他方式和批处理之间的同步问题。