如何根據v$parameter查詢Oracle隱含參數
Oracle的隱含參數在Oracle的官方文檔中是不會出現的,這些參數主要是Oracle內部用於控制某些功能的開關,或者就像今天eygle講的,Oracle牛逼之處就是可能幾年前開發的一個功能就放到當時的版本中,讓你“試用”,但你卻不知道,如果碰巧因為遇見了這個問題的bug,Oracle會告訴你可以使用這個參數關掉,等使用者“試用”了幾年之後,相對來說穩定了,Oracle發布新版本,說推出了一個新功能,且穩定運行了N年…
那麼如何知道某個隱含參數是何含義、全稱是什麼、預設值是什嗎?這裡至少有兩種方法是之前eygle和secooler大師在書中或課堂上介紹過的,記錄於此,便於查詢。
方法一:通過vfixedviewdefinition視圖得到視圖定義。我們知道查詢常規參數可以使用select?fromvparameter,那麼v$parameter是如何定義的?
看到其來自於這個GV$PARAMETER視圖,繼續查:
可以看出其來自於兩個X內部表XKSPPI和X$KSPPCV的查詢結果,網上搜了一些介紹:
引自http://blog.csdn.net/cupid1102/article/details/50427308
X$KSPPCV用以記錄當前的設定的值,及是否使用了預設值等資訊
ADDR RAW(4) –記憶體位址
INDX NUMBER –序號,從0開始
INST_ID NUMBER
KSPPINM VARCHAR2(64) –參數名稱
KSPPITY NUMBER
KSPPDESC VARCHAR2(64) –描述
X$KSPPI則是一個基礎資料表,用於記錄參數名、參數說明等簡單的資訊。
ADDR RAW(4) –記憶體位址
INDX NUMBER –序號,從0開始
INST_ID NUMBER –instance number
KSPPSTVL VARCHAR2(512) –當前值
KSPPSTDF VARCHAR2(9) –預設值
KSPPSTVF NUMBER –標誌欄位,用來說明(‘Modified’or ‘System Modified’ or
is_adjusted)
KSPPSTCMNT VARCHAR2(255) –comment
根據需求,可以調整下上述SQL語句,檢索隱含參數名稱、當前值、描述等幾個關鍵資訊,可以用like查詢精確找出某個特殊的隱含參數,例如這輸入了_partition開頭的隱含參數名稱:
查詢結果如下,有兩個_partition開頭的隱含參數:
方法二:使用trace查看執行計畫。
首先設定set autot trace,然後執行:
可以看見這條SQL底層是使用了兩個X$內部表的全表掃描,這兩個表就是上述方法一種介紹的內部表。再看謂詞部分,有一些過濾查詢條件,是使用NOT LIKE過濾了”_”開頭的ksppinm參數名稱,即過濾了隱含參數,根據方法一中介紹的表欄位定義,可以拼接出自己想要的查詢語句,查詢出隱含參數和非隱含參數。
網上還有人通過改造,可以讓show parameter命令顯示出隱含參數,原理基本都是這些,有些技巧性的東西如果有興趣找時間可以學習一下。
總結:
對於視圖等封裝結構,可以通過執行計畫,找出其基表,為探究其深入的原理提供了手段方法。