连接查询的表顺序
默认情况下,当对多个表进行连接查询时,Oracle分析器会按照从右到左的顺序处理FROM子句中的表名。例如下面的语句:
SELECT a.empno, a.ename,c.deptno, c.dname, a.log_action
FROM emp_log a, emp b, dept c;
在执行时,Oracle会先查询dept表,根据dept表查询的行作为数据源串行连接emp表继续执行,因此dept表又称为基础表或驱动表。由于连接的顺序对于查询的效率有非常大的影响,因此在处理多表连接时,必须选择记录条数较少的表作为基础表,Oracle会使用排序与合并的方式进行连接。比如先扫描dept表,然后对dept表进行排序,再扫描emp表,最后将所有检索出来的记录与第一个表中的记录进行合并。
如果有3个以上的表连接查询,就需要选择交叉表(Intersection Table)作为基础表。交叉表是指哪个被其他表所引用的表。由于emp_log
表时dept表和emp表的交叉表,即包含dept的内容又包含emp的内容,因此上述查询可以将emp_log
作为驱动表:
SELECT a.empno, a.ename,c.deptno, c.dname, a.log_action
FROM emp b, dept c, emp_log a;
指定WHERE条件顺序
在查询表时,WHERE条件的顺序往往影响了执行的性能。默认情况下,Oracle采用自下而上的顺序解析WHERE子句,因此在处理多表查询时,表之间的连接必须写在其他的 WHERE条件之前,过滤数据记录的条件写在最后,以便过滤了数据之后再进行连接处理。
另外在索引的利用上,也需要注意,使用索引列作为条件比非索引列作为条件的性能要高很多。当然在面对复杂的查询时,也许需要在多个