好几天前看完了第七章,终于有时间整理一下学习笔记了
虽说不能真正的掌握,但是至少了解一些皮毛也是有好处的。
至少面试的时候可以吹牛逼。
一、子查询非嵌套
当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