暂无图片
Oracle标量子查询的原理是什么?
我来答
分享
胡武
2023-06-24
Oracle标量子查询的原理是什么?

Oracle标量子查询的原理是什么?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新

当一个子查询介于select与from之间,这种子查询就叫标量子查询。

标量子查询类似一个天然的嵌套循环,而且驱动表固定为主表,嵌套循环被驱动表的连接列必须包含在索引中。同理,标量子查询中子查询的表连接列也必须包含在索引中。

建议在实际生产工作中,尽量避免使用标量子查询。原因是:假如主表返回大量数据,主表的连接列基数又很高,那么子查询中的表会被多次扫描,从而严重影响SQL性能;如果主表数据量小,或者主表的连接列基数很低,那么这个时候也可以使用标量子查询,但要给子查询中表的连接列建立索引。

当SQL里面有标量子查询,可以将标量子查询等价改写为外连接,从而使它们可以进行HASH连接。

暂无图片 评论
暂无图片 有用 1
暂无图片
杜伟

标量子查询查询示例:

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

通过子查询关联出dept表的部门名称,(select dname from dept b where a.deptno=b.deptno)就是子查询部分,当emp表有多少行,子查询部分就需要运行多少次,运行时是把emp该行的deptno值传入到子查询中,对dept进行查询,如果子查询里的表在执行查询时使用不了索引,外面表有多少行,里面就需要执行多少次全表扫描。

所以建议对标量子查询进行改写,使用left join方式:

select empno,ename,a.deptno,b.dname from emp a left join dept b on a.deptno=b.deptno

改写后只需要对dept扫描一次即可,可以自行测试下,如果是大表无索引,这种改写优化效果非常明显。

暂无图片 评论
暂无图片 有用 2
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏