-
优化sql语句:
-
select s_no,snamefrom student s where s_no in (select a.s_no from sc a, sc b where a.c_no='1'and b.c_no='2' and a.s_no=b.s_no);
sc表有唯一联合索引s_no,c_no,s表有主键s_no,该语句查看执行结果如下:
执行顺序为a,b,s,可看出对sc a,sc b表的查询都是唯一性索引扫描,对student表进行全表扫描,如果student表数据量很大,结果集只是很少的行,该sql效率会很低。假设student表数据量很大,结果集只是很少的行,优化后的sql如下:
selects.s_no,sname from Student s,(select a.s_no from SC a, SC b where a.s_no=b.s_noand a.c_no='1' and b.c_no='2' ) as c where s.s_no=c.s_no;
查看执行计划如下:
执行顺序为a,b,derived2,s,其中derived2为c表,对a表进行index类型查找,只遍历索引树,对b表进行唯一索引扫描,对c表进行全表扫描,对student进行唯一索引扫描,所以,此sql适用于student表数据量很大,结果集很小;第一个sql适用于student表数据量和结果集数据量差距较小时。