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

lfree發表於2021-11-15

[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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章