Kevin's World

God helps ones who help themselves

drop synonym比较慢

最近碰到一个很奇怪的问题:删除同义词非常慢,平均每次操作需要19s.
由于先是通过imp工具将数据文件导入到不同的数据库中,然后再删除无效的同义词,所以开始怀疑是不是因为这个原因.紧接着我又在新环境中新创建一个同义词,随后再删除,但速度依然还是很慢.
查看metalink后发现这是一个oracle的bug,在10.2.04以及10.2.0.3版本中都会受到影响.
当时由于数据库最近不会进行任何升级的工作,因此尝试使用oracle 9i的脚本重建all_synonyms视图,此问题得到暂时解决.
如下是9i的脚本,仅供参考:
CREATE OR REPLACE VIEW ALL_SYNONYMS
(owner, synonym_name, table_owner, table_name, db_link)
AS
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 */)
)
)
);