在10g中,由于解决了9I ALL_SYNONYMS的bug,导致查询ALL_SYNONYMS性能下降。

上一篇介绍了9i中,如果创建一个指向同义词的同义词,则在ALL_SYNONYMS视图中可能看不到这个同义词。10g中则解决了这个问题。可以看到,9i和10g的ALL_SYNONYMS视图的定义发生了变化:

SQL> select

dbms_metadata.get_ddl('VIEW', 'ALL_SYNONYMS') from dual;

DBMS_METADATA.GET_DDL('VIEW','ALL_SYNONYMS')

--------------------------------------------------------------------------------

CREATE OR REPLACE FORCE VIEW

"SYS"."ALL_SYNONYMS" ("OWNER",

"SYNONYM_NAME", "TABLE_OWNER", "TABLE_NAME",

"DB_LINK") A

S

select u.name, o.name, s.owner, s.name, s.node

from sys.user$ u, sys.syn$ s, sys.obj$ o

where o.obj# = s.obj#

and o.type# = 5

and o.owner# = u.user#

and (

o.owner# in (USERENV('SCHEMAID'), 1 /* PUBLIC */) /* user's private, any public

*/

or /* user has any privs on base object */

exists

(select null from sys.objauth$ ba, sys.obj$ bo, sys.user$ bu

where bu.name = s.owner

and bo.name = s.name

and bu.user# = bo.owner#

and ba.obj# = bo.obj#

and ( ba.grantee# in (select kzsrorol from x$kzsro)

or ba.grantor# = USERENV('SCHEMAID')

)

)

or /* user has system privileges */

exists (select null from v$enabledprivs

where priv_number in (-45 /* LOCK ANY TABLE */,

-47 /* SELECT ANY TABLE */,

-48 /* INSERT ANY TABLE */,

-49 /* UPDATE ANY TABLE */,

-50 /* DELETE ANY TABLE */)

)

)

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

PL/SQL Release 9.2.0.4.0 - Production

CORE 9.2.0.3.0 Production

TNS for Linux: Version 9.2.0.4.0 - Production

NLSRTL Version 9.2.0.4.0 - Production

而10g在9i的基础上添加了新的部分:

SQL> select

dbms_metadata.get_ddl('VIEW', 'ALL_SYNONYMS') from dual;

DBMS_METADATA.GET_DDL('VIEW','ALL_SYNONYMS')

--------------------------------------------------------------------------------

CREATE OR REPLACE FORCE VIEW

"SYS"."ALL_SYNONYMS" ("OWNER",

"SYNONYM_NAME", "TABLE_OWNER", "TABLE_NAME",

"DB_LINK") A

S

select u.name, o.name, s.owner, s.name, s.node

from sys.user$ u, sys.syn$ s, sys.obj$ o

where o.obj# = s.obj#

and o.type# = 5

and o.owner# = u.user#

and (

o.owner# in (USERENV('SCHEMAID'), 1 /* PUBLIC */) /* user's private, any public

*/

or /* user has any privs on base object in local database */

exists

(select null

from sys.objauth$ ba, sys.obj$ bo, sys.user$ bu

where s.node is null /* don't know accessibility if syn for db link */

and bu.name = s.owner

and bo.name = s.name

and bu.user# = bo.owner#

and ba.obj# = bo.obj#

and ( ba.grantee# in (select kzsrorol from x$kzsro)

or ba.grantor# = USERENV('SCHEMAID')

)

)

or /* local object, and user has system privileges */

(s.node is null /* don't know accessibility if syn is for db link */

and exists (select null from v$enabledprivs

where priv_number in (-45 /* LOCK ANY TABLE */,

-47 /* SELECT ANY TABLE */,

-48 /* INSERT ANY TABLE */,

-49 /* UPDATE ANY TABLE */,

-50 /* DELETE ANY TABLE */)

)

)

)

union

select u.name, o.name, s.owner, s.name, s.node

from sys.user$ u, sys.syn$ s, sys.obj$ o, sys."_ALL_SYNONYMS_TREE" st

where o.obj# = s.obj#

and o.type# = 5

and o.owner# = u.user#

and o.obj# = st.syn_id /* syn is in tree pointing to accessible base obj */

and s.obj# = st.syn_id /* syn is in tree pointing to accessible base obj */

SQL> select * from v$version;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi

PL/SQL Release 10.2.0.3.0 - Production

CORE 10.2.0.3.0 Production

TNS for Linux: Version 10.2.0.3.0 - Production

NLSRTL Version 10.2.0.3.0 - Production

正是增加的这部分UNION语句,解决了9i中bug的同时,也带来了性能影响。

问题是不仅仅是用户访问ALL_SYNONYMS同义词变慢,而很多工具会导致系统递归调用中访问ALL_SYNONYMS视图,从而导致系统整体性能下降。

对于用户访问这个视图的性能下降,最简单的办法是仿照9i的语法,在当前用户建立一个视图,比如ALL_SYNONYMS_V92,然后创建一个当前用户下的同义词ALL_SYNONYMS指向当前用户的ALL_SYNONYMS_V92视图。由于用户下的同义词优先级高于PUBLIC SYNONYMS,用户在访问的时候就会访问用户下的ALL_SYNONYMS_V92视图,不过9i中指向同义词的同义词就可能在ALL_SYNONYMS中无法访问。

不过这种方式对于一些系统调用或者工具产生的调用无效,因为这些SQL可能访问的并不是PUBLIC同义词,而是SYS.ALL_SYNONYMS对象,这就导致了用户创建的同义词无效。如果是这种情况,那么为了解决性能问题,只要仿照9i的语法重建10g的ALL_SYNONYMS视图,同样9i中的bug就会在10g中再次出现。

Oracle在文档ID 377037.1详细描述了这个问题。看来有的时候正确性和性能很难完全兼顾。

oracle10g自带的公共同义词,10g ALL_SYNONYMS同义词查询性能下降相关推荐

  1. oracle10g自带的公共同义词,Oracle10g实战教程第07讲视图、同义词、序列

    <Oracle10G in Action>课程计划表 第1讲 Oracle10G安装及体系结构概述 课程目标:了解Oracle10G的体系结构.运行机制. 课程内容: ? Oracle10 ...

  2. oracle10g 操作系统,各版本操作系统ORACLE 10g 下载(包括windows和linux)

    现在oracle官网只能下载11g最新版本了,本人学习和工作需要下载的10g地址如下:Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Sta ...

  3. oracle公共同义词查找,[Oracle]同义词(synonym)

    (一)同义词的概念 同义词是数据库中表.视图.索引或其他模式对象的别名,与视图相似,同义词不占用实际的存储空间,在数据字典中只存同义词的定义. 在开发数据库时,应尽量避免直接引用表.视图或其他数据库对 ...

  4. Oracle 原理: 公有同义词 和 私有同义词

    同义词是现有对象的一个别名,和 C++ 里面的typedef关键字很像.同义词都能简化SQL语句,隐藏对象的名称和所有者,也可以提供对对象的公共访问. 在Oracle中,同义词分为公有同义词和私有同义 ...

  5. 对象、同义词和公有同义词顺序选取

    笔者开发的项目中,广泛使用公有同义词技术.通过公有同义词,消除不同数据源对象之间访问的差异,做到数据逻辑和物理上的分布. 突然想到一个问题:在一个schema下,如果存在自身对象.私有同义词和公有同义 ...

  6. oracle 同义词名称,ORACLE同义词总结

    同义词概念 Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系.它可以节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;它扩展了数据库的使 ...

  7. oracle中private同义词和public同义词

    项目中遇到,遂从网上搜索了下,觉得如下解释较为通俗易懂: 假设oracle有以下两个用户: admin , visitor 我们在admin下建立了 testtable 这个表,并且对visitor用 ...

  8. WordNet、FrameNet 同义词及相关词汇查询

    WordNet.FrameNet 同义词及相关词汇查询 WordNet.FrameNet 相关Python API 使用,请参考链接: WordNet Python API (整理总结) FrameN ...

  9. mysql实现oracle的同义词_Oracle的同义词(synonyms)详解

    知识扩展:数据库对象 表.视图.序列.过程.函数.程序包,甚至其它同义词都可以创建同义词. 1.同义词:私有同义词.公有同义词. 私有同义词只能被当前模式的用户访问.私有同义词名称不可与当前模式的对象 ...

最新文章

  1. 耗时很长的程序忘加nohup就运行了怎么办?
  2. 服务幂等以及常用实现方式
  3. 哪些行为会影响个人征信?
  4. python实战excel_实战python 读写EXCEL表
  5. 收获,不止SQL优化——抓住SQL的本质--第十一章
  6. Java编程:获取输入的三种方法
  7. IO口模拟SPI总线问题
  8. matlab 图片保存pdf,matlab中的图片保存技巧.pdf
  9. laravel项目出现Non-static method Redis::hGet() cannot be called statically的解决方法
  10. 成功解决win10下某些文件路径不存在问题
  11. Abbreviation----Java实现
  12. apicloud aui 做底部导航
  13. 路由器php系统时间设置时间设置时间设置,4G工业路由器系统设置与时间密码设置...
  14. debian中网易云音乐打不开的一种解决方法
  15. CentOs 7 中vim文本编辑器的下载及使用
  16. 多源异构航班航迹数据流实时融合方法研究
  17. MetaQ 简单使用(数据同步框架)
  18. python程序应用经典实例-Python实例应用经典讲解
  19. 中国移动手机话费查询号码1008611
  20. 单反相机的传奇—佳能单反50年辉煌之路(连载三)

热门文章

  1. Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock
  2. java filereader 示例_J04-Java IO流总结四 《 FileReader和FileWriter 》
  3. PHP系统能不能加爬虫,php能做爬虫吗
  4. Qt (5.10.0)for android
  5. python将字典写入json文件中
  6. 判断泛型的值是否为default(T)
  7. react native中有关日期的组件DatePicker 示例
  8. CI Weekly #22 | flow.ci 新版 iOS 构建流程的 4 大变化
  9. 完整的目标管理三段俱全
  10. linux删除大量文件时遇 -bash: /bin/rm: Argument list too long 错误