2012-03-30 33 views
2

誰能告訴我INLINE Pragmapinned objects in oracle之間有什麼區別。Pragma Inline Vs在Oracle中固定對象

按我的理解pinning objects means Keeping database packages in the Oracle database's系統全局區(SGA)共享pool`

Inline Pragma specifys一個子程序調用,或者不是,被內聯。內聯用compile time的被調用子程序副本替換子程序調用(對同一程序單元中的子程序)。

oracle是否還將編譯後的代碼存儲在SGA?中,如果用戶對數據庫中的同一對象執行Pinning以及Inline Pragma會怎麼樣。

+0

嗯,這把我帶回來。自從我需要在Oracle中安裝軟件包已經很多年了。 – 2012-03-31 06:01:50

回答

3

Oracle必須將代碼加載到SGA中的共享池中才能運行它,是的。通常,不需要在內存中固定對象,因爲Oracle會根據最近最少使用的算法將它們從共享池中取出。所以如果一段代碼被頻繁調用,它將被保存在共享池中。如果它很少被調用,它可能會老化,您可能需要在下次調用時從磁盤重新讀取它。但是,這通常就是你想要發生的事情 - 你想優化頻繁發生的事情,並且當你從磁盤讀取不常訪問的代碼時,你想要花費幾個磁盤I/O的代價。

內聯確定編譯器是否選擇複製內聯子程序的代碼,這通常會使編譯後的產品稍微更大,因此需要共享池中的空間稍微多一些,以免在運行時跳轉到子程序。一般來說,內聯是不是你要手動一個PRAGMA指定,它的東西,會被編譯器通過設置PLSQL_OPTIMIZE_LEVEL被照顧的自動3.從PL/SQL Language Reference

隨着PLSQL_OPTIMIZE_LEVEL = 3,PL/SQL編譯器尋求機會 來內聯子程序。您不需要指定要內聯的子程序。 但是,您可以使用INLINE雜注(具有前面的語法) 爲內聯賦予一個高優先級的子程序,然後編譯器 將其內聯,除非其他考慮事項或限制使內聯 不受歡迎。

+0

在我的數據庫中'PLSQL_OPTIMIZE_LEVEL'被設置爲2,如果我在我的生產數據庫中將其值設置爲3,那麼是否有任何缺點? – 2012-03-30 17:09:05

+0

@GauravSoni - 可能不是。但是,與任何參數更改一樣,最好先在較低的環境中進行測試,因爲編譯器優化肯定會造成性能問題。罕見,但可能。 – 2012-03-30 17:12:09

+0

:謝謝你的解釋 – 2012-03-30 17:17:34