版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lingyiwin/article/details/83415405
千万级数据处理
前言
近日一次版本上线时,涉及到千万级数据处理,因一时疏漏造成Oracle数据库回滚段爆掉,造成版本重复发布。
系统日常运行中,产生部分历史数据,这些数据不能删除。日积月累情况下,出现超级大的数据量。
- 需要将客户信息历史表中客户性别为女性,出生日期在90年以前的客户存放至另一张表。目前客户信息历史表的数据量高达9000多万。
如下SQL在执行过程:耗时40多分钟,后续变更处理方式后,耗时4-5分钟。数据库回滚段使用5G左右空间。
--执行SQL如下,table_cust_history该表数据量高达9000多万。
insert into table_temp
select ... from table_cust_history
where sex=''
and birthday < '';
SQl分析:
1. 首先分析查询,因数据量大,查询条件必须走索引,才能保证查询速度
2. 耗时40分钟的原因是,我们在创建table_temp表的时候,惯性思维给该表加的相应字段的索引,导致没插入一条数据,索引都要变动,耗时就上去了
3. 正确的做法应该为:删除索引(主键索引要保留),插入数据,再加入索引。最后加索引耗时仅需几分钟。
--执行如下删除SQl 删除1150万左右的数据,耗时20分钟
delete from table_cust_history
where exists( select 1 from table_temp where '条件' )
SQL分析:两张表的关联条件必须要有索引,
耗时比上面SQL长,是因为这个SQL要查询多次,子查询的条件查询,删除时条件查询。
因业务逻辑更新,需要初始化表中的数据。需要初始化的数据为4000多万。
执行SQl更新字段包含一个带索引的字段。耗时40分钟,回滚段使用了19-20G。
总结:索引不仅仅提升了查询的效率,同时也会降低大数据量存储更新的效率
- 若遇见千万级的数据查询,一定要使用索引字段限制数据量。
- 大数据量更新,插入数据时,建议删除无关紧要的索引,等数据操作完毕后,再加入索引。
- 操作千万级数据时,应提前看一下数据库回滚段设置大小。如果可以尽量大些。
千辛万苦,熬到半夜,吸取经验,记得教训。
希望能给前赴后继的小伙伴带来帮助。