天天看点

View Merge 在安全控制上的变化,是 BUG 还是增强 ?

什么是 View Merge

View Merge 是 12C 引入的新特性,也是一种优化手段。当查询中引用了 View 或 inline view 时,优化器可以将主查询中的查询条件并入视图当中去进行优化选择以获得代价最小的执行计划。而如果视图不属于当前执行语句的用户,View Merge 就可能存在潜在 OPTIMIZER_SECURE_VIEW_MERGING(默认是 TRUE)控制。当执行语句的用户缺乏对视图的 MERGE VIEW 权限,也没有 MERGE ANY VIEW 权限时,是否允许优化器进行 View Merge 优化。

View Merge 问题重现

下面是一个安全控制导致语句未能正确选择索引的演示。首先创建相应的测试用户(demo)并授予相应的权限。

SQL 代码如下:

创建相应的测试函数。

创建测试用户 demo 2,授予连接与 resource 的权限。

创建测试表 t1,t2 以及测试视图 v1,v2。并往表中加入测试数据,同时授予 demo 访问的权限。

将 share pool 以前保存的 SQL 执行计划全部清空,释放少数的共享池资源,保证 SQL 执行计划的重新解析。

查看执行计划。

获取正确的索引访问方式

在上面的查询计划中,未能正确选择索引访问方式。当我们赋予用户 MERGE VIEW 权限(或修改 OPTIMIZER_SECURE_VIEW_MERGING 为 FALSE)后,执行计划获取到了正确的索引访问方式。

授权的 SQL 代码如下:

再对 share pool 中原有的执行计划进行清空一次,便于重新解析。

具体的 SQL 代码如下:

对上面语句再解析一遍,获取该语句的执行计划。

具体 SQL 代码与执行计划如下:

可以看到上面的执行计划已经正确选择索引访问方式了。

修改 optimizer_secure_view_merging 参数。

研究收获

从上面的案例可以分析出 View Merge 是 12C 的一个新特性,因为这个安全控制导致在查询计划中未能正确选择索引访问方式,只需要取消掉这个新特性或者将 MERGE ANY VIEW 授予用户后就可以得到相应正确的索引访问方式。

原文发布时间为:2018-03-13

本文作者:黄玮