一、问题
在写SQL表与表之间的关联时,如何优化表执行效率;
二、分析
1、首先我们要明确一个概念——【驱动表】,所谓驱动表,就是Oracle分析器首先切入你整个SQL的第一个表,是整个SQL分析的切入点,因为Oracle分析器会从后向前解析你的SQL,如果驱【驱动表】的数据量比较小,将【驱动表】放在最后,将会较大提升查询效率;
2、当SQL中有交叉表时,作为关联其他表的中间表,建议将关联表放在所以表中的最后位置,这样,Oracle从后往前查找,其会优先查找该中间表,然后在顺藤摸瓜,拿到其他的关联表;
3、where 条件中的顺序:
当有多个where条件是,建议将能最大限度筛掉数据的条件放最后,这样,之后的条件会在较少的数据量的情况下处理,效率会高很多,类似的原理就是:你准备找一个人,你在一堆人中说:
①、男的站出来;100人中站出来50个男的,剩余都是女的;
②、你继续说,20岁-30岁的男的留下,其他人都回去;50人只剩20人;
③、你又说,我要找的人叫“AAA”,最后只剩2个人的;
④、最后你说,我要找的人身份证号码是:123456;结果只剩1个人;
但是如果你先说:我要找身份证号码是:123456的人,结果只有1个人站出来了;接下来再对其他的条件是否满足,将会更轻松;
4、尽量不要使用“非”操作符,如NOT,!=,<>,!>,!<,NOT IN,NOT LIKE,NOT EXIST;非操作符会导致Oracle对表执行权标扫描,所以尽量不要使用非操作符;
5、使用索引
①对于较大的表才添加索引;
②一个表被允许建立多个索引,但是不要尽量建多个,因为比较浪费;增加维护成本,得不偿失;
③、使用经常被所谓搜索条件的字段作所谓索引的关键字;因为不会使索引浪费;
6、唯一索引列一定要非NULL;
因为UNIQUE关键字可以为列添加唯一所以,表名列不允许有重复值,但是,但是,但是,它却允许多个记录都为NULL,并且Oracle判定两个NULL是不相等的;如果查询条件中使用了IS NULL 或IS NOT NULL ,Oracle会停止使用该列上的索引,然后会进行全表扫描;