通常将条件放在 where 子句或连接条件中,在内连接中没有明显差异。
如果您使用外连接,将条件放在 where 子句中会缩短查询时间,因为当您在 where 子句中使用条件时
左外连接,不满足条件的行将从结果集中删除,结果集变小。
但是如果在左外连接的连接子句中使用条件,则与在 where 子句中使用条件相比,不会删除任何行并且结果集更大。
如需更多说明,请按照示例进行操作。
创建表A
(
没有数字,
名称 VARCHAR2(10),
日期日期
)
----一个数据
插入 A
从对偶中选择 1,'Amand',to_date('20130101','yyyymmdd');
提交;
插入 A
select 2,'Alex',to_date('20130101','yyyymmdd') from dual;
提交;
插入 A
select 3,'Angel',to_date('20130201','yyyymmdd') from dual;
提交;
创建表B
(
bno NUMBER,
bname VARCHAR2(10),
日期日期
)
插入 B
从对偶中选择 3,'BOB',to_date('20130201','yyyymmdd');
提交;
插入 B
从对偶中选择 2,'Br',to_date('20130101','yyyymmdd');
提交;
插入 B
select 1,'Bn',to_date('20130101','yyyymmdd') from dual;
提交;
首先,我们有正常的查询,它将 2 个表相互连接:
select * from a inner join b on a.ano=b.bno
结果集有 3 条记录。
现在请运行以下查询:
select * from a inner join b on a.ano=b.bno and a.rdate=to_date('20130101','yyyymmdd')
select * from a inner join b on a.ano=b.bno where a.rdate=to_date('20130101','yyyymmdd')
正如您在上面看到的结果,行数没有差异,根据我的经验,大容量数据没有明显的性能差异。
请运行以下查询:
select * from a left outer join b on a.ano=b.bno and a.rdate=to_date('20130101','yyyymmdd')
在这种情况下,输出记录的数量将等于表 A 的记录。
select * from a left outer join b on a.ano=b.bno where a.rdate=to_date('20130101','yyyymmdd')
在这种情况下,不满足条件的 A 记录从结果集中删除,正如我所说,结果集中的记录将更少(在这种情况下为 2 条记录)。
根据以上例子我们可以得出以下结论:
1-在使用内部连接的情况下,
将条件放在 where 子句或 join 子句中没有特别的区别,但请尝试将表放在 from 子句中,以使中间结果行数最少:
(http://www.dba-oracle.com/art_dbazine_oracle10g_dynamic_sampling_hint.htm)
2-在使用外连接的情况下,只要您不关心确切的结果行数(不关心表 A 的缺失记录,表 B 中没有配对记录,表 B 的字段将为空对于结果集中的这些记录),将条件放在where子句中以删除一组不满足条件的行,并通过减少结果行数来明显提高查询时间。
但在特殊情况下,您必须将条件放在连接部分中。例如,如果您希望结果行数等于表“A”行数(这种情况在 ETL 流程中很常见),您必须将条件放在连接子句中。
3-避免子查询被很多可靠的资源和专家程序员推荐。它通常会增加查询时间,你可以在结果数据集很小的时候使用子查询。
我希望这会很有用:)