oracle 的外连接 left join

将来现在 2013-01-18 02:27:01
数据库里面有两张表 A表100W,B表20W,sql语句是
 select coun(1) from A left join B on a.id = b.id 
查询结果执行10秒
后面在写一条
select count(1) from B  inner join A  on B.id = A.id

查询结果只需0.几就出来了 给我的感觉就是第一条没用到索引 为什么会出现这种情况?
如果直接用
select count(1) from A ,B where a.id = b.id
执行效果和第二条差距不大.
我以前主要是在sqlserver上面开发,现在突然发现在oracle上执行一样的语句效率还要低些,现在大多数sql语句都是用的外连接,杂办?难道只有改代码?
...全文
533 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
将来现在 2013-01-21
  • 打赏
  • 举报
回复
谢谢大家,查找了下资料原因找到了. 因为NULL值与索引的特性所决定的。即null值不会被存储到B树索引。因此应该为表 t 的列 object_id 添加 not null 约束。 设计表的时候注意非空字段.哎.
izj 2013-01-21
  • 打赏
  • 举报
回复
额。。。SQL优化问题。。 count 实际上走的全表扫描, 想要提高查询速度,就应该避免全表扫描 你可以给SQL加上hint 或者索引。。
将来现在 2013-01-21
  • 打赏
  • 举报
回复
 select count(1) from uglsh.tb_installationdocuments a left join uglsh.tb_customer b on a.cid = b.id  where 1 = 1 and 
a.cid >= 0 and b.id >= 0
改成这样就只需要0.5秒,下面的截图是第一个sql语句的执行计划.
槑党--一缕风 2013-01-18
  • 打赏
  • 举报
回复
select coun(1) from A left join B on a.id = b.id 100万*20万 的数量级集合 select count(1) from B inner join A on B.id = A.id 20万*A表满足(B.id = A.id)的数量级集合 所以查询时间肯定不一样
槑党--一缕风 2013-01-18
  • 打赏
  • 举报
回复
把执行计划贴出来 大家给你看看
zhangabc 2013-01-18
  • 打赏
  • 举报
回复
用left join没问题的。写left join有时候要注意where条件的顺序。 多看看你的SQL的执行计划,看看索引情况。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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