Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >View Merge 在安全控制上的变化,是 BUG 还是增强 ?

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

作者头像
数据和云01
发布于 2019-05-26 12:52:04
发布于 2019-05-26 12:52:04
5560
举报
文章被收录于专栏:数据库新发现数据库新发现

什么是 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 代码如下:

SQL> conn / as sysdba Connected. SQL> drop user demo cascade; User dropped. SQL> create user demo identified by demo; User created. SQL> grant CREATE SYNONYM,UNLIMITED TABLESPACE to demo; Grant succeeded. SQL> grant CONNECT,PLUSTRACE,RESOURCE to demo; Grant succeeded.

创建相应的测试函数。

SQL 代码如下:

SQL> conn demo/demo Connected. SQL> create or replace FUNCTION fnCheckNumber(in_num IN VARCHAR2) RETURN NUMBER IS 2 BEGIN 3 return 1; 4 end; 5 / Function created.

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

SQL 代码如下:

SQL> conn / as sysdba Connected. SQL> drop user demo2 cascade; User dropped. SQL> create user demo2 identified by demo2; User created. SQL> grant create session, resource to demo2; Grant succeeded. SQL> alter user demo2 default tablespace lmt_data; User altered. SQL> alter user demo2 quota unlimited on lmt_data; User altered. SQL> grant create view to demo2; Grant succeeded. SQL> drop user demo2 cascade; User dropped.

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

SQL 代码如下:

SQL>conn demo2/demo2 Connected. SQL> create table t1 as select * from all_tables; Table created. SQL> create table t2 as select * from all_objects; Table created. SQL> create unique index t2_idx1 on t2(object_id) compute statistics; Index created. SQL> create view v1 as select * from t1; View created. SQL> create view v2 as select * from t2; View created. SQL> grant select on t1 to demo; Grant succeeded. SQL> grant select on t2 to demo; Grant succeeded. SQL> grant select on v1 to demo; Grant succeeded. SQL> grant select on v2 to demo; Grant succeeded.

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

SQL 代码如下:

SQL> conn / as sysdba Connected. SQL> alter system flush shared_pool; System altered.

查看执行计划。

SQL 代码如下:

SQL> conn demo/demo Connected. SQL> set autot trace SQL> select fnCheckNumber(tablespace_name) from demo2.v1 union all select 1 from demo2.v2 where object_id = fnCheckNumber('567785951'); 106 rows selected. Execution Plan ---------------------------------------------- Plan hash value: 3515064724 ------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------- | 0 | SELECT STATEMENT | | 75158 | 953K| 40 (3)| 00:00:01 | | 1 | UNION-ALL | | | | | | | 2 | TABLE ACCESS FULL | T1 | 106 | 530 | 3 (0)| 00:00:01 | |* 3 | VIEW | V2 | 75052 | 952K| 37 (3)| 00:00:01 | | 4 | INDEX FAST FULL SCAN| T2_IDX1 | 75052 | 439K| 37 (3)| 00:00:01 | ----------------------------------------------- Predicate Information (identified by operation id): -------------------------------------- 3 - filter("OBJECT_ID"="FNCHECKNUMBER"('567785951')) Statistics ---------------------------------------- 661 recursive calls 2 db block gets 501 consistent gets 163 physical reads 0 redo size 2428 bytes sent via SQL*Net to client 629 bytes received via SQL*Net from client 9 SQL*Net roundtrips to/from client 33 sorts (memory) 0 sorts (disk) 106 rows processed

获取正确的索引访问方式

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

授权的 SQL 代码如下:

SQL> conn / as sysdba Connected. SQL> grant MERGE ANY VIEW to demo; Grant succeeded.

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

具体的 SQL 代码如下:

SQL> alter system flush shared_pool; System altered.

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

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

SQL> set autot trace SQL> select fnCheckNumber(tablespace_name) from demo2.v1 union all select 1 from demo2.v2 where object_id = fnCheckNumber('567785951'); 106 rows selected. Execution Plan ----------------------------------------------- Plan hash value: 809018835 --------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------- | 0 | SELECT STATEMENT | | 107 | 536 | 4 (0)| 00:00:01 | | 1 | UNION-ALL | | | | | | | 2 | TABLE ACCESS FULL| T1 | 106 | 530 | 3 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| T2_IDX1 | 1 | 6 | 1 (0)| 00:00:01 | ----------------------------------------------------- Predicate Information (identified by operation id): ----------------------------------------------- 3 - access("OBJECT_ID"="FNCHECKNUMBER"('567785951')) Statistics ------------------------------------------ 680 recursive calls 2 db block gets 340 consistent gets 0 physical reads 0 redo size 2428 bytes sent via SQL*Net to client 629 bytes received via SQL*Net from client 9 SQL*Net roundtrips to/from client 33 sorts (memory) 0 sorts (disk) 106 rows processed

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

修改 optimizer_secure_view_merging 参数。

SQL 代码如下:

SQL> show parameter optimizer_secure_view_merging NAME TYPE VALUE -------------------------- ----------- ----------------------- optimizer_secure_view_merging boolean TRUE SQL> alter system set optimizer_secure_view_merging =false; System altered.

研究收获

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年03月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
有关Oracle role的总结
oracle的role算是对sys privilege 和object privilege的打包。 今天深入的测试了下,还算有不少的东西。 role不是schema对象 像table等在一个schema里面不能有同名的schema object,但是可以有同名的table和role,如下。 SQL> conn test1/test1 Connected. SQL> create role testrole; Role created. SQL> create table testrole as select
jeanron100
2018/03/13
1.1K0
【DB笔试面试604】在Oracle中,存储概要(Stored Outline)的作用是什么?
OUTLINE的原理是将调好的执行计划(一系列的Hint)保存起来,然后使用该效率高的执行计划替换之前效率低下的执行计划,从而使得当系统每次执行该SQL时,都会使用已存储的执行计划来执行。所以,可以在不改变已有系统SQL的情况下达到改变其执行计划的目的。OUTLINE方式是通过存储Hint的方式来达到执行计划的稳定与改变。当发现低效SQL之后,可以使用Hint优化它,对于SQL代码可以修改的情况,直接修改SQL代码加上Hint即可。
AiDBA宝典
2019/09/29
1.1K0
关于物化视图疑问(32天)
--初始化操作, 创建两个用户一个,testo,一个test. 在testo上创建表,test上创建物化视图。 SQL> create user testo identified by testo; User created. SQL> create user test identified by test; User created. SQL> grant connect,resource to testo,test; Grant succeeded. SQL> grant create materia
jeanron100
2018/03/13
1K0
Oracle 18c新特性:Schema-Only 帐号提升应用管理安全性
在 Oracle 18c 中,一个特殊类型的帐号被引入到数据库当中,这特特性被称为 Schema-Only 帐号,这个帐号通过 NO AUTHENTICATION 语句建立,没有密码,也就不允许直接登录,所以这种帐号类型是 纯模式类型。
数据和云
2018/12/07
6630
Oracle 18c新特性:Schema-Only 帐号提升应用管理安全性
启用 AUTOTRACE 功能
AUTOTRACE是一个SQL*Plus工具,用于跟踪SQL的执行计划,收集执行时所耗用资源的统计信息,是SQL优化工具之一,下面给出启用
Leshami
2018/08/07
6570
oracle查看密码修改记录_oracle查询数据库用户密码到期时间
ORA-01920: user name ‘T1’ conflicts with another user or role name
全栈程序员站长
2022/09/19
3K0
ORA-00942: table or view does not exist
      在过程,包,函数,触发器中调用Oracle相关动态性能视图时,需要授予适当的权限,否则会收到表和视图不存在的错误提示。即使你可以单独查询这些视图。因为动态性能视图依赖于底层表,无法直接对其授予权限。下面就是这个现象相关的例子。
Leshami
2018/08/13
2K0
Oracle 角色、配置文件
增加或删除角色中的某一权限,被授予该角色的所有用户或角色自动地获得新增权限或删除旧的权限
Leshami
2018/08/07
1K0
【DB笔试面试608】在Oracle中,如何使用STA来生成SQL Profile?
利用STA对语句进行优化后,STA会对语句进行分析,采用最优的优化策略,并给出优化后的查询计划。可以按照STA给出的建议重写语句。但是,有些情况下,你可能无法重写语句(比如在生产环境中,SQL语句又在一个包中)。这个时候就可以利用Sql Profile,将优化策略存储在Profile中,Oracle在构建这条语句的查询计划时,就不会使用已有相关统计数据,而使用Profile的策略,生成新的查询计划。
AiDBA宝典
2019/09/29
2.8K0
【DB笔试面试608】在Oracle中,如何使用STA来生成SQL Profile?
【DB笔试面试627】在Oracle中,对表执行COMMENT(注释)操作需要什么权限?
Oracle的COMMENT语句可以给一个列、表、视图或快照添加一个最多2K字节的注释。注释被存储在数据字典中,并且可以通过数据字典视图DBA_COL_COMMENTS(列的注释)和DBA_TAB_COMMENTS(表的注释)查看COMMENTS列。COMMENT语句的语法:
AiDBA宝典
2019/09/29
1.5K0
【DB笔试面试627】在Oracle中,对表执行COMMENT(注释)操作需要什么权限?
Oracle基础维护01-常用管理命令总结
此时,sga和pga自动调整,sga_target最小为4M,pga_aggregate_target最小为1M;
Alfred Zhao
2019/05/24
4600
Oracle 用户、对象权限、系统权限
用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作
Leshami
2018/08/07
3.1K0
Oracle海量数据优化-01分区的渊源
当我们看到这条语句时,会想到什么呢? 一条再简单不过的按照条件删除数据库的操作。 如果大量存在,会不会引起系统性能问题呢?
小小工匠
2021/08/16
3970
关于drop user的cascade选项解惑(52天)
在数据库中,有时候需要删除用户,大多数时候都需要使用cascade选项,有些时候却不需要,想知道在这个简单的命令之后数据库倒底在干什么, 这时候给一些指定的操作加上trace就跟把那层纱窗揭开一样,可以很清楚看到数据库倒底在干些什么。 10046,sql_trace等都是一些不错的选择。 首先来复现一下这个问题。‘ 创建一个新用户,然后马上删除。 SQL> create user jeanron identified by jeanron; User created. SQL> drop user jea
jeanron100
2018/03/13
1.7K0
SQL基础--> 序列(SEQUENCE)、同义词(SYNONYM)
--=============================================
Leshami
2018/08/07
1.4K0
关于虚拟索引的学习(r3笔记第75天)
昨天简单总结了下不可见索引,今天来说说虚拟索引。 这两个索引听起来有点类似。其实差别还是比较大。 不可见索引有对应的索引段,而虚拟索引没有对应的索引段存在。 不可见索引可以通过alter语句来直接切换可见不可见。而对于虚拟索引而言这些操作都不支持。 不可见索引可以在user_indexes中查到对应的数据字典信息。但是虚拟索引在user_indexes中都没有记录,最后只能从dba_objects里面勉强查到一条它存在的记录。 不可见索引和虚拟索引都有对应的数据库参数,可以通过a
jeanron100
2018/03/15
6930
奕新集团GG环境搭建(无图)
D:\Oracle官方文档\E11882_01\install.112\e24326\toc.htm
全栈程序员站长
2021/12/23
1.9K0
Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
在前面的文章《Oracle 19c 十大新特性一览》中,我们曾经提到 Oracle 19c的一个重要增强,就是ADG的自动DML转发:
数据和云
2019/03/07
1.4K0
Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
Oracle 12c PDB浅析(r9笔记第10天)
不管怎么样,12c出来这么久,总是因为各种各样的原因没有开始学习,现在似乎还是有些晚了。总是耳闻PDB在12c是一种全新的架构模式,在各种技术聊 天也大概知道是一种可插拨的新型架构模式,但是似乎SQLServer中也有类似的架构,不管怎么样Oracle圈内还是很火,而且听说12c r2可以支持4096个pdb,这个也太大了,docker装一下试试:) 自己也在本地尝试了一下,其实中间了花了些时间,中途总是被各种事情打断,所以留下的都是一些零碎的知识片段,自己索引把环境重新删了再做几次。 在这种尝试中我试了
jeanron100
2018/03/16
9310
Oracle 12c PDB浅析(r9笔记第10天)
【OCP最新题库解析(052)--题49】Examine these facts about a database.
该系列专题为2018年4月OCP-052考题变革后的最新题库。题库为小麦苗解答,若解答有不对之处,可留言,也可联系小麦苗进行修改。
AiDBA宝典
2019/09/29
4470
相关推荐
有关Oracle role的总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档