千万级数据处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 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。

总结:索引不仅仅提升了查询的效率,同时也会降低大数据量存储更新的效率

  1. 若遇见千万级的数据查询,一定要使用索引字段限制数据量。
  2. 大数据量更新,插入数据时,建议删除无关紧要的索引,等数据操作完毕后,再加入索引。
  3. 操作千万级数据时,应提前看一下数据库回滚段设置大小。如果可以尽量大些。

千辛万苦,熬到半夜,吸取经验,记得教训。

希望能给前赴后继的小伙伴带来帮助。

猜你喜欢

转载自blog.csdn.net/lingyiwin/article/details/83415405