Oracle中Leftjoin的on和where的效率差别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle中Leftjoin的on和where的效率差别
假设有两个表a、b
使⽤on
Select * from a left join b on b.col = a.col and b.col2 = ‘aa’
使⽤ where
Select * from a left join b on b.col = a.col where b.col2 = ‘aa’ and b.col2 is null
// b.col2 is null作⽤是防⽌因b表中没有匹配数据,照成a表原有记录⽆法返回的问题
分析
1、on条件是在⽣成临时表时使⽤的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表⽣成好后,再对临时表进⾏过滤的条件。

这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

语句测试
set serveroutput on ; -- 必须运⾏,否则打印结果⽆法显⽰
declare
I Number;
Starttime Timestamp;
Endtime Timestamp;
Begin
select current_timestamp(5) into starttime from Dual;
I := 1;
While I<=10000 Loop
dbms_output.put_line(i);
Execute Immediate ' '; --此处放⼊sql语句
i := i+1;
End Loop;
Select Current_Timestamp(5) Into Endtime From Dual;
dbms_output.put_line('10000条语句运⾏时间为(毫秒):' || (endtime - starttime)); --打印⼀个Interval类型数据,显⽰时间差
end;
测试结果
On语句, 10000条语句运⾏时间为(毫秒):+000000000 00:00:01.032850000
Where 语句 10000条语句运⾏时间为(毫秒):+000000000 00:00:01.013420000
结论
Where语句的性能优于on语句
其实sql语句的运⾏效率也可以通过查询oracle的系统视图来查看,但时间关系今后再研究了。


在C#中使⽤linq进⾏查询
// 写得⽐较仓促,见谅了
var reList = from DataRow a in dtA.Rows
join DataRow b in dtB.Rows on
new {t = a["col"], l=’aa’}
equals
new {t = b["col"], l = b["col2"] }
into rightRow from rw in rightRow.DefaultIfEmpty()
select new
{
Col1 = a["col"],
Col2 = rw["col2"]
};
在linq中使⽤into rightRow from rw in rightRow.DefaultIfEmpty()可以保证查询类型left outer join的效果,如果left join中有多个查询条件,使⽤new两个对象进⾏⽐较即可。

相关文档
最新文档