SQL书写技巧:
1、针对分区表,如果可以使用分区条件的,一定要加分区条件。分区条件的使用,可以减少不必要的数据访问,加快查询数据,如TB_CSV_ACCEPT_FLOW_OPERATOR表,以accept_month字段分区,在sql中如加上accept_month=’value’,则可以在指定的分区内查询数据,而不是全表扫描。
2、分区字段不可以加函数,函数操作导致无法使用分区条件,引起全表扫描,如FT_MID_SUBTOTAL_ITEM表,以sum_date字段分区,查询201001月份数据,错误写法:substr(sum_date,1,6)=’201001’,无法使用分区条件,正确写法应该是sum_date>=20010101 and sum_date<=20100131。
3、分区字段类型必须与比较的值类型一致,不一致的类型比较,导致分区条件无法使用。如TB_CSV_ACCEPT_FLOW_OPERATOR表,分区字段accept_month类型是char,正确的写法是accept_month=’201001’。错误写法accept_month=201001。
4、不必要的函数操作,在对字段做比较时,不建议对字段做函数操作。如:change_expire_date字段是date型,在比较时如果写成to_char(change_expire_date,’yyyymmdd’)=’20100101’则比change_expire_date=to_date(‘20100101’,’yyyymmdd’)来的低效,耗用更多的CPU资源。
5、索引的使用,索引的字段比较,比较双方的类型必须一致,否则无法使用索引,tb_acc_account表owner字段建有索引,owner是varchar2类型,正确的写法:owner=’ 595305002876112’,错误的写法:owner=595305002876112
6、索引的过渡使用,数据集市数据库对单个会话的IO没有做限制,不建议直接移值boss的写法,通过循环或游标的方式以索引来大量访问某张表。比如:希望查询几万个user_id某天的话单: BOSS可能需要通过循环来查询: For v in (select user_id from temp_user_id) loop Select * from tb_seu_call_201001 where user_id=v; End loop; 数据集市的写法:直接两表关联 Select a.*from tb_seu_call_201001 a,temp_user_id b where a.user_id=b.user_id
7、数据删除,删除全表数据请使用truncate table xxx,删除某个分区数据请使用alter table xxx truncate partition p1;
8、表结构设计考虑: 表是否需要分区: 考虑条件:表是否很大,是否经常需要删除某天/某月/某种类型的数据,数据是否经常变动,变动的数据是否会从一个分区迁移到另外一个分区。 合理的字段类型,必要的约束条件。 表是否压缩,压缩表可以减少存储占用,访问时也可减少IO操作,代价是cpu资源使用的增加。数据经常变动的表(update,delete操作)不适合于压缩。存储过程中使用的中间临时表,数据插入后就不在变更的目标表,可以考虑压缩。
9、数据插入的优化: /*+append nologging*/ hints提示可以加快输入的插入数据,减少重做日志生成,如果是压缩表,数据插入时同时也完成压缩。但该提示不可用于并发度高的表,即同时有多个人在执行DML操作的表。另外,有delete操作的表也不适合append提示。
原文地址:http://www.cnblogs.com/aiguozhe/p/3731691.html