[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博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2842119/ ,如需转载,请注明出处,否则将追究法律责任。