日期:2014-05-17  浏览次数:20757 次

哪种写法好呢?
以下两个SQL结果一样的,哪种写法好呢?

select (select r.organ_name from ORGANIZATION r where r.organ_id=t.land_gts_id) as 部门 from CASE_DAY_LIST t;

select r.organ_name as 部门 from CASE_DAY_LIST t left join ORGANIZATION r on r.organ_id=t.land_gts_id;

------解决方案--------------------
一般来说是第二种写法好一些,其实严格来说的话,也要看两个表的数据量。
------解决方案--------------------
这两SQL不等价
语句1与下面的语句等价
SELECT r.organ_name 
FROM CASE_DAY_LIST t,ORGANIZATION r
 WHERE r.organ_id=t.land_gts_id

------解决方案--------------------
相比第二个写法效率。
------解决方案--------------------
第二种方法效率高,易读,常用!!
------解决方案--------------------
方法2

方法1,可能会造成用不了索引
------解决方案--------------------
第二种写法好,第一个是嵌套子查询,执行计划会强制走nested loop,如果CASE_DAY_LIST的数据量比较大,那么这个执行计划效率并不高,第二个写法CBO按cost寻找最优执行计划,执行效率是最高的。以前优化过这样一个sql,对这个印象还比较深刻。
------解决方案--------------------
不能这么武断下结论,ORGANIZATION表中organ_id是主键时两个语句是一样的,这种情况通常用于编码转名称。
和表的数据量以及查询结果集有一定的关系。

 ORGANIZATION表较大时,而查询结果集较小时,第一种效率可能会比较高,
 而ORGANIZATION较小,查询结果集较大时,第二种效率可能会比较高,

ORGANIZATION较大两表连接可能改变原来的执行计划,导致效率低。

在子查询中一般需要加上rownum=1的条件,一方面防止id重复,另一方面能提高性能。

 上面说的都是可能,并没有绝对。

 
------解决方案--------------------
必须第二种方法好