快速大批量处理数据需要的关注的地方

      这几天去某银行协助批量处理的优化工作。到那里一看,真知道了为啥有些银行的账单或者刷卡、入账等信息会延迟一天或者两天。先不说他们的处理机制,但看那些开发出来的代码,我就无语了。
      工作还是得做,还得耐心从怎样加快SQL的执行入手工作。我分别从索引的建立、索引的使用、代码书写、数据分布、并发的使用、事务控制等几个基本方面给现场的人员做了介绍。
      1、索引建立的原则
             这个内容我借鉴了一个老师的简单总结:
             四要点:一是细心选择符合索引键的前后顺序(确定索引前导列);
                             二是where子句中数据关联字段的确定;
                             三是排序分组字段的确定;
                             四是空值字段在索引中的处理;
             这里只提一下选择索引键值前后顺序的简单办法:select count(distinct 字段) from .... 比较一下即可,简单的说就是以匹配值最少的字段作为前导列时索引效果最好;where条件中关联字段最好是主键或者是索引的键值(最好是前导列);如果有排序和分组,尽量的将该种情况考虑进去。剩下的一个空值字段在索引中的处理方法,就是和一个非空字段的组合处理,而且使用时尽可能的以索引字段为条件实现匹配。
            补充一下:快速建立索引一定要注意使用并行,并注意可以使用nologging方法(如果在DG环境时还需要多考虑一下,毕竟DG环境下是通过归档日志来同步数据);使用完并行一定要记得修改;


        2、索引使用的原则
              在第一部分中说道了一部分,这里简单 补充一下:
             A、在有大量的数据update时,则尽量少用位图索引;
             B、要注意隐含数据转换的发生造成的不使用索引的情况;
             C、大量数据维护时,一定要避免维护索引字段,即频繁发生更改的字段不可作为索引字段;
             D、要注意表上的索引,到底是否被使用(方法很简单alter index monitoring,一定要记得关闭!)
              E、反转索引的使用。
          3、代码书写的原则
               在保证逻辑正确的同时,一定要注意常用的SQL代码书写技巧。
               1、in子句的处理(尽量使用exist);
               2、like的使用 (尽量少用)
               3、关联upadte的写法(最长见的应用)
               4、insert语句中使用/* +append  parallel(table_name,number)*/ 开启并行;
               5、关注函数的使用以及字段类型的匹配;
           这里要补充一下:常见的工具都有自动生成SQL的功能,一定要注意生成代码的使用,这里会有陷阱,稍不注意就掉里了。
           4、数据的分布
               数据的分布主要说的就是尽可能的将数据进行分区甚至子分区,分区方式无非就是常见的hash(数据离散化,减少争用)、list或者组合分区;分区的键值有些时候是可以组合键值的。这里也要注意的是,索引也可以hash分区,分区的数量一定要是2的n次方。
            5、并发的使用
             并发的使用多在批量数据的更新和导入导出,这点儿网上资料不少,无非就是append 或者paralle的使用,不过要注意的是,在并发DML或并发DDL时,会对数据表或者索引的参数有影响,一定要将其修改过来,在我其它的文章中也是多次强调的。
             备注:通常这些还是要结合nologging一起使用,目的就是加快处理速度。
            6、事务的控制
             在大数据量的DML中,对事务的处理是最关键的,不仅仅因为是为了避免事务的争用、产生事务锁等,更重要的是从原理上block的ITL本身就不是无限的,要综合考虑设置initrans以及PCTFREE、PCTUSED参数的配置。
             这方面从开发角度来讲,简单一句话:控制好commit。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值