在编写select语句的时候,总是会碰到下面这两个问题,就是有两种写法均可以达到一个相同的目的,但是却不知道到底哪种的sql语句的执行效率更高一些。下面展示这两个问题:
问题一:表关联时,直接表关联和做表后表关联,哪个执行效率高?
1.直接使用两个表关联,再选出需要的字段。

select a.deptno, a.dname, b.ename
  from dept a, emp b
 where a.deptno=b.deptno;

2.先挑选出两个表中关联字段、需要字段,from子查询造表后再进行关联。

select a.deptno, a.dname, b.ename
  from (select deptno, dname from dept) a,
  	   (select deptno, ename from emp) b
 where a.deptno=b.deptno;

问题二:筛选字段时,in字句和利用表关联筛选,哪个执行效率高?
1.使用in字句,字句中包含需要的字段。

select sal
  from emp
 where ename in (select ename 
 				   from emp
 				  where deptno=10);

2.利用from子查询选出需要的字段,利用表关联筛选字段。

select sal
  from emp a,(select ename 
			    from emp
			   where deptno=10) b
 where a.ename=b.ename;

为了解决这一困惑,需要一个数据量很大的库做测试。在此要感谢董老师的帮助。

测试结果:

问题一:

presto 两个表关联查询 两个表关联查询优化_sql


可以看到,先选出需要的字段再进行表关联的速度会快一些。在这里我理解为,因为提前的将无关的字段排除了,所以在关联的时候会省去拼接这些无关字段的时间。

问题二:

presto 两个表关联查询 两个表关联查询优化_字段_02


可以看到利用表关联去筛选数据的做法很慢,因为已经56秒了还没执行完毕,虽然子查询的数据是完全一致的,但是in字句明显要比表关联筛选要快的多,至于其中的原理,暂时还不理解 ,以后在学原理的时候希望可以了解到其中的原由。

总结:

1.在涉及到表关联时,最好将关联字段,需要的字段。做from子查询处理之后再进行表关联,会提高执行效率。

2.在涉及条件筛选某一字段时,where【筛选字段】in…字句,要比利用from 字句然后利用表关联筛选字段的方式效率高。