3、 from emp e,dept d where d.deptno >10 and e.deptno =30; 如果dept表返回的记录数较多的话,上面的查询语句会比下面的查询语句响应快得多。select * from emp e,dept d where e.deptno =30 and d.deptno >10;●最好不要在WHERE子句中使用函数或表达式,如果要使用的话,最好统一使用相同的表达式或函数,这样便于以后使用合理的索引。SELECT *FROM T1WHERE F1*2=100 改成 SELECT *FROM T1WHEREF1=100/2● 使用WHERE
4、(NOT)EXISTS 来代替(NOT)IN子句,使用NOT EXISTS 子句可以有效地利用索引。尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(但NOTIN不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。例子1: 10SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp); 例子2:SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp
5、WHERE dept.deptno = emp.deptno); 明显的,2要比1的执行性能好很多。因为1中对emp进行了全表扫描,这是很浪费时间的操作。而且1中没有用到emp的索引, 因为没有where子句。而2中的语句对emp进行的是缩小范围的查询。● 通过使用>=、<=等,避免使用NOT命令如这个例子:select * from employee where salary<>3000; 对这个查询,可以改写为不使用NOT:select * from employee where salary<3000 or salary>3000; 虽然这两种查询的结果一样,但是第二种
6、查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。●外部联接+的用法外部联接+按其在=的左边或右边分左联接和右联接。若不带+运算符的表中的一个行不直接匹配于带+预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回。利用外部联接+,可以替代效率十分低下的 not in 运算,大大提高运行速度。例如,下面这条命令执行起来很慢:select a.empno from emp a where a.empno not in(select empno from emp1 where job=‘SALE’);索引倘
7、若利用外部联接,改写命令如下: select a.empno from emp aleftjoinemp1 b on a.empno=b.empno where b.empno is null and b.job=‘SALE’;例如表少,但情况复杂的时候应该写如下语句:selecta.empnoASempno,(selectemp2.addressfromemp2wherea.id=emp2.id)ASaddress,(selectemp3.address1fromemp3whereb.id=emp3.