暂无图片
为什么经常将in子查询改写为with as呢?
我来答
分享
语菲
2023-06-12
为什么经常将in子查询改写为with as呢?

为什么经常将in子查询改写为with as呢?

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

在一些SQL中,in子查询一般比较复杂,想直接使用HINT让in子查询作为嵌套循环驱动表反向驱动主表比较困难,所以经常有将in子查询改写为with as。需要注意的是with as子句中必须要添加/*+ materialize */,同时主表与子查询关联列必须有索引。如果不添加/*+ materialize */、主表与子查询关联列没有索引,优化器就不会自动将with as作为嵌套循环驱动表。with as子句添加了/*+ materialize */会生成一个临时表,这时就将复杂的in子查询简单化了,之后优化器会将with as子句展开(unnesting)。将子查询展开一般是子查询与主表进行HASH连接,或者是子查询作为嵌套循环表与主表进行关联。

暂无图片 评论
暂无图片 有用 9
暂无图片
广州_老虎刘
2023-06-14
如果把“经常”改成“有时”, 也许可能会找到一些特殊案例。 在生产系统,这种情况大部分可以通过hint调执行计划,让这些特殊sql不改写也能得到一个很好的执行计划。 当然,在开发环境, 开发人员不掌握hint的用法,遇到一些复杂SQL就只能通过各种改写尝试去解决了。 你如果有这样的案例,可以发给我看看是否能够不改写就能得到你要的执行计划。 我的微信 ora_service
广州_老虎刘

没听说过有这个说法,这个提法本身就是有问题的。

暂无图片 评论
暂无图片 有用 0
2023-06-13
可以深入探讨。
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏