Oracle中必要的查询变换

好几天前看完了第七章,终于有时间整理一下学习笔记了

虽说不能真正的掌握,但是至少了解一些皮毛也是有好处的。

至少面试的时候可以吹牛逼。

 

一、子查询非嵌套

当where子查询中有in 、not in、exists、not exists等,CBO会尝试将子查询展开(unnest),从而消除FILTER,这个过程叫做子查询非嵌套。

为什么一定要消除FILTER呢,因为驱动表是固定的,这样就固定了执行计划。如果此时的执行计划是错误的或者并非是最佳的,就会引起性能问题,就要改写SQL。

虽然要注意消除执行计划中的FILTER,但是不一定有FILTER的都是性能查的。

子查询中存在exists或者not exists时,子查询中有固化子查询的关键词(union/union all/start with connect by/rownum/cube/rollup)时容易产生FILTER

 

二、视图合并

当SQL语句中有内联视图(in-line view, from后面的子查询),或者SQL语句中有用create view创建的视图,CBO会尝试将内联视图/视图拆开,进行等价的改写,这个过程叫做视图合并。

多表关联时候,由于内联合并会导致需求本身想实现的关联关系。可以在子查询里添加HIN:no_merge禁止视图合并

与子查询非嵌套一样,视图中有固话子查询的关键字时,就不能发生视图合并。其中关键字包括:union/union all/start with connect by/rownum/cube/rollup

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值