这几天去某银行协助批量处理的优化工作。到那里一看,真知道了为啥有些银行的账单或者刷卡、入账等信息会延迟一天或者两天。先不说他们的处理机制,但看那些开发出来的代码,我就无语了。
工作还是得做,还得耐心从怎样加快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。
工作还是得做,还得耐心从怎样加快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。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/759027/viewspace-755689/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/759027/viewspace-755689/