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

来源:这里教程网 时间:2026-03-03 17:07:41 作者:

[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$表的访问。

相关推荐