oracle 内连接和查询时单独查询的效率区别

Fly_m 2011-10-18 10:58:55
如下所示:
有两个表
t_game_sporter(参赛运动员表)和t_sporter(运动员表)其中 t_game_sporter 上有一个t_sporter的外键列为sporter_id。现在我要查询以下信息,即查询出所有已参赛的参赛运动员id以及相对应的运动员姓名。如下是相对应的sql
sql1:
select t.name,b.id from t_sporter t,t_game_sporter b where b.sporter_id = t.id

sql2:
select id,(select t.name from t_sporter t where t.id = sporter_id) from t_game_sporter

我们首先假设 参赛运动员表中不存在sporter_id为null的情况,在这种情况下。sql1和sql2查询出来的结果均是一样的。

现在要分析的是这两条sql的运行效率。首先t_sporter表的数量肯定比t_game_sporter表数量大。

sql1的解释计划如下所示:

sql2的解释计划如下所示:


请高手来回答一下为什么两个的差距这么大,在数据库层面是如何进行工作的?

如果 t_game_sporter(参赛运动员表)有sporter_id为null的情况,又怎么来写sql1呢?
...全文
225 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
simple1986_2008 2011-12-09
  • 打赏
  • 举报
回复
为什么有的知识点 在别人提醒后才能想起 自己以前有接触过这个知识点??
iqlife 2011-10-18
  • 打赏
  • 举报
回复
SQL1,两个都走了全表扫描,而没有走索引
而SQL2,运动员表查询的时候走了索引,
为什么SQL1没有走索引?做个10053看看为什么没有走索引,

在SQL1中通过index hints来强制SQL使用index.
select /*+ index(t_sporter sys008388) */ t.name,b.id from t_sporter t,t_game_sporter b where b.sporter_id = t.id

t_game_sporter(参赛运动员表)有sporter_id为null的情况,又怎么来写sql1呢?
select t.name,b.id from t_sporter t,t_game_sporter b where b.sporter_id = t.id(+)
xmanliming 2011-10-18
  • 打赏
  • 举报
回复
顶下 学习学习
Fly_m 2011-10-18
  • 打赏
  • 举报
回复
#2 楼
我刚看了一下,是有关于索引的。还有些关于查询计划的,下来再仔细看看了。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧