Oracle中Left join的on和where的效率差别
来源:互联网 发布:db2和sqlserver 编辑:程序博客网 时间:2024/05/18 02:40
假设有两个表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两个对象进行比较即可。
- Oracle中Left join的on和where的效率差别
- oracle中left join中on和where的区别
- oracle中left join中on和where的区别
- Oracle的left join中on和where的区别
- Oracle的left join中on和where的区别
- Oracle的left join中on和where的区别
- Oracle的left join中on和where的区别
- Oracle的left join中on和where的区别
- Oracle的left join中on和where的区别
- Oracle的left join中on和where的区别
- oracle join连接方法以及left join中on 和where的区别
- [转载]SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
- Mysql中left join on and和left join on where 的区别
- Oracle的left join中on和where的区别以及与(+)的区别
- left join 中 where 和 on 的重新理解
- left join中on和where的区别是什么
- left join 中on和where的讲解
- (转)Oracle的left join中on和where的区别
- accelerated c++ 0-2
- 判断字符串是否为回文字符串
- bzoj1711 [Usaco2007 Open]Dining吃饭(最大流/三分图匹配)
- 设置session时间
- 用 FileSaver 导出excel表
- Oracle中Left join的on和where的效率差别
- MVC5 新建项目里不包含jquery.unobtrusive-ajax.js(MVC5异步表单的问题)解决方法
- 借了不还,还打人的call()与apply()方法!
- 隐秘的广告销售技巧
- java8实战六:并行流
- 创建maven项目后,修改jre版本alt+f5后,返回默认1.5版本解决方法
- ASP.NET Core 中间件
- java图片等比缩放
- 关于大型网站技术演进的思考(三):存储的瓶颈(3)