SQL规范
SQL要尽量简单,关联的表越少越好,最好不超过三个,尽量避免复杂的多表关联,难以优化,随着数据量的增加性能的风险很大;
避免写过于复杂的SQL,不要用一条复杂的SQL就把功能做出来,能拆分成多个简单的,就要拆分成多个简单的SQL。
合理使用临时表, 子查询复杂的,尽量把子查询写成临时表
特别是left join后面跟复杂子查询,
或连接复杂子查询后,又跟其它表连接,要把子查询写成临时表
VT表不是真正的临时表,频繁的创建和往VT表插入数据,会引起很多硬解析,同时会导致数据库内部字典做大量的DML操作,引起严重latch 争用,或者触发Oracle bug
我们尽量从业务层面去多考虑,复杂的SQL“替”Oracle优化器选择使用哪张表做驱动表。 Left join 要尽量提前过滤掉数据,保持前面查询到的结果集瘦小。有时候并非真的要left join 才能达到目的,有可能inner join就可以达成,而inner join的效率通常要高很多,而且一般不需要关注驱动表是哪一张表
在不影响业务的前提下尽量减小事务的粒度,尽量及时commit,避免阻塞
没有把握的情况下,不要使用hints提示,在一个数据库上使用是正确的,在另一个数据库未必是对的,因为数据分布和查询条件可能会完全不同,可能会走差的执行计划,方法是让Oracle自己选择执行计划
严禁视图中再引用其它视图,视图再引用视图性能绝大多数情况下性能非常差,后期几乎无法维护和优化,需要的数据要根据业务来从基表中取
With as 这种临时表有不少情况是会走错执行计划,性能一般情况下不如VT表,但它优点是可以让硬解析更少
注意表关联字段的字符类型,避免类型不一致导致的全表扫描,特别是nvarchar与varchar的字段