oracle 一个简单的sql语句执行效率的比较
表:table1(FId,Fclass,Fscore),用最高效最简单的SQL列出各班成绩最高的列表,显示班级,成绩两个字段。一:selectfclass,fscoref...
表:table1(FId,Fclass,Fscore),用最高效最简单的SQL列出各班成绩最高的列表,
显示班级,成绩两个字段。
一:
select fclass,fscore from table1 b
where fscore in (select max(fscore) from table1 where fclass=b.fclass);
二:
select fclass,max(fscore) from table1
group by fclass;
最近做面试题经常能看到诸如这类问题,题很简单,就是执行效率这方面以前没怎么想过。
我记得以前听人说group by的效率不高,所以没用group by方式,但是答案却是group by,
表比较小,2条语句执行时间一致,我想问下这2条语句到底哪一条的效率高些?
另外就是一般写sql,提高效率要注意哪些地方(我目前只知道尽量不用全表扫描,还有就是绑定变量可以提高效率~不过不会写绑定变量) 展开
显示班级,成绩两个字段。
一:
select fclass,fscore from table1 b
where fscore in (select max(fscore) from table1 where fclass=b.fclass);
二:
select fclass,max(fscore) from table1
group by fclass;
最近做面试题经常能看到诸如这类问题,题很简单,就是执行效率这方面以前没怎么想过。
我记得以前听人说group by的效率不高,所以没用group by方式,但是答案却是group by,
表比较小,2条语句执行时间一致,我想问下这2条语句到底哪一条的效率高些?
另外就是一般写sql,提高效率要注意哪些地方(我目前只知道尽量不用全表扫描,还有就是绑定变量可以提高效率~不过不会写绑定变量) 展开
5个回答
展开全部
比较一下的话,语句一查询次数是两次,而语句二只有一次,我们尽量减少查询次数。
语句一其实就是二的另一种实现,其效果是和语句一相同,但多了很多中间不必要的步骤,所以肯定优先选择二。
至于SQL效率问题多看看别人总结的经验会很快了解,多看执行计划。
查看执行计划在SQL PLUS下可以用:explain sql语句;
PLSQL DEVELOPTER下可以写好语句直接按F5;
我们通常知道使用索引要比全表好,使用索引的时候,ORACLE先通过索引快速找到记录的物理地址,然后再通过物理地址找到记录。全表则是直接扫描所有记录,找到想要的,看起来慢多了,但它少了通过索引查找物理地址这一步,所以在有些情况下可能要比索引快,比如表里的记录很少。
绑定变量,你可以参考:
http://zhidao.baidu.com/question/298893776?&oldq=1
还有子查询,group by,in,not in,很多人都说尽量不用,其实这些都不能一概而论,要看具体的实际情况,参考执行计划,根据需要去选择,千万别有偏见
语句一其实就是二的另一种实现,其效果是和语句一相同,但多了很多中间不必要的步骤,所以肯定优先选择二。
至于SQL效率问题多看看别人总结的经验会很快了解,多看执行计划。
查看执行计划在SQL PLUS下可以用:explain sql语句;
PLSQL DEVELOPTER下可以写好语句直接按F5;
我们通常知道使用索引要比全表好,使用索引的时候,ORACLE先通过索引快速找到记录的物理地址,然后再通过物理地址找到记录。全表则是直接扫描所有记录,找到想要的,看起来慢多了,但它少了通过索引查找物理地址这一步,所以在有些情况下可能要比索引快,比如表里的记录很少。
绑定变量,你可以参考:
http://zhidao.baidu.com/question/298893776?&oldq=1
还有子查询,group by,in,not in,很多人都说尽量不用,其实这些都不能一概而论,要看具体的实际情况,参考执行计划,根据需要去选择,千万别有偏见
追问
还是追问1楼那个问题,就是你们都说参考执行计划,但是我不是很明确如何参考执行计划。
执行计划我目前就知道看是不是全表,如果是全表加索引之类的....没有什么解决方法,能不能结合你们工作中的例子讲一下如何结合执行计划来改变sql。
讲好了我加分。
追答
关注计划中COST值,找出查询效率的瓶颈,剩下的具体情况再具体分析,使COST降到最佳。除了COST,计划中还是SQL语句执行时间,还有一个和COST并列的值,那个考虑的时候比较少,但是对SQL的执行也影响很大,应该是数据的IO,不去考虑是因为它的值通常和我们去优化SQL无关,就是无法通过SQL改变数据IO的效率,当然不是绝对的。
参考一下,目前我这没有ORACLE环境,所以不能提供具体例子了。
展开全部
查询一和二都是全表内查询,一中嵌套子查询,还是用的In操作符,效率较低。像单表的这种查询二是最快的,大部分情况oracle内置的东西,效率都不低的,如果还想提交效率,可在fclass加个索引
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
oracle里面有一个执行计划窗口,可以测试出每条SQL花费的时间cost,通过比较久可以知道了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
肯定是2 执行效率高..
sql要尽量减少子查询
sql要尽量减少子查询
追问
但是以前也有人说尽量减少group by啊,不知道group by和子查询哪个更有效率一些?
追答
如果数据量小 其实差不了太多.. 如果数据量大点 子查询的效率会很低
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这两个查询 个人倾向于用第二个 第一个复杂化了。 提高sql 效率不是说用不用索引和绑定变量 有时候全表扫描的效率会高于走索引 sql的调优 还是从执行计划入手 看情况而定
追问
大概说一下执行计划一般怎么定吧。
我查看执行计划之后,只会看看是不是走的全表,需不需要走索引之类的
你们一般看执行计划的话,会关注些什么,并做些什么改动呢?
麻烦大概举例说下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |