ITPub博客

首页 > 数据库 > Oracle > [20211112]SYS_CONTEXT ('USERENV','DBID').txt

[20211112]SYS_CONTEXT ('USERENV','DBID').txt

原创 Oracle 作者:lfree 时间:2021-11-15 09:22:06 1 删除 编辑

[20211112]SYS_CONTEXT ('USERENV','DBID').txt

--//昨天看了华为监控执行sql语句,我发现一个规律,就是谓词条件经常出现:

WHERE  INSTANCE_NUMBER IN (SELECT instance_number FROM v$INSTANCE)
       AND DBID IN (SELECT DBID FROM v$database)

--//也就是instance_number,DBID 通过两个视图v$INSTANCE,v$database,实际上应该尽量规避这样的读取模式。
--//也许编程读一次获取dbid,instance_number 然后保存在变量里面使用参数。

--//突然想起应该利用SYS_CONTEXT 函数取这样更加科学,如果能支持获取dbif可以规避对v$database的访问,实际上就是减少对控制文
--//件的访问。实际上对于文件型数据库可能影响并不大,OS有缓存功能,而对于asm类型的数据库,每次都是一次"硬读"控制文件。可
--//以大大减少对控制文件的访问。

SYS@127.0.0.1:17101/dyhis> select SYS_CONTEXT ('USERENV','INSTANCE') c10    from dual ;
C10
----------
1

--//我看oracle官方手册,我发现没有对应读取DBID的函数,感觉有点奇怪,总觉应该有1个函数读取DBID。
--//尝试使用SYS_CONTEXT ('USERENV','DBID') 居然可以。我测试一下18c,19c版本都可以。

SYS@127.0.0.1:17101/dyhis> select SYS_CONTEXT ('USERENV','DBID') c10 ,dbid from v$database ;
C10              DBID
---------- ----------
34857349     34857349

--//唯独缺点就是读取的返回结果是字符类型,不过直接使用不会存在隐式转化,dbid,instance_number都是number类型。
--//当然要对方修改不现实的,毕竟要保持代码的通用性。当然我觉得修改INSTANCE_NUMBER=SYS_CONTEXT ('USERENV','INSTANCE')
--//还是可行的,减少一些对X$表的访问。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2842119/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    3081
  • 访问量
    6806398