這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何進(jìn)行Oracle 11g中的Native PL/SQL代碼編譯,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序定制開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了懷來(lái)免費(fèi)建站歡迎大家使用!
Oracle環(huán)境中,PL/SQL是我們進(jìn)行業(yè)務(wù)邏輯實(shí)現(xiàn)的最佳手段,同時(shí)也是和Oracle數(shù)據(jù)庫(kù)本身結(jié)合的最好的語(yǔ)言。使用好PL/SQL本身功能,可以大幅度提高我們的工作效率。
我們從最開(kāi)始學(xué)習(xí)計(jì)算機(jī)和編程開(kāi)始,就接觸到一個(gè)概念叫做“二進(jìn)制程序碼”。計(jì)算機(jī)可以直接進(jìn)行二進(jìn)制代碼的執(zhí)行,就目前而言,二進(jìn)制是計(jì)算機(jī)執(zhí)行速度最快的一種形式。其他的高級(jí)語(yǔ)言,如C、C++,都是通過(guò)編譯Compile和連接Link過(guò)程,轉(zhuǎn)化為二進(jìn)制程序。
二進(jìn)制程序的特點(diǎn)是執(zhí)行速度快。但是缺點(diǎn)也是明顯的,那就是針對(duì)一種物理機(jī)器類型(如CPU架構(gòu))、一種操作系統(tǒng),二進(jìn)制執(zhí)行程序的格式定義都是不同的。所以,針對(duì)每一種操作系統(tǒng)和物理平臺(tái),理論上我們都需要進(jìn)行一遍Compile和Link過(guò)程,形成獨(dú)特的可執(zhí)行程序。
中立語(yǔ)言,或者稱為中間語(yǔ)言的出現(xiàn),結(jié)束了這樣的局面。這種代表性就是Java和諸多的腳本語(yǔ)言,借助一個(gè)“平臺(tái)相關(guān)”的虛擬機(jī)軟件,我們可以讓相同的代碼在不同平臺(tái)上運(yùn)行。這也就是所謂的“一次編譯,多處執(zhí)行”。
默認(rèn)情況下,PL/SQL代碼就是這樣的中間語(yǔ)言,也可以稱為解釋語(yǔ)言。在不同的平臺(tái)上,相同的代碼在運(yùn)行。相對(duì)于Native代碼而言,解析代碼的性能一直是人們關(guān)注的重要問(wèn)題。將代碼Native本地化,是人們經(jīng)常提到的一種程序優(yōu)化手段。
1、PL/SQL語(yǔ)句Native化
PL/SQL語(yǔ)句的Native化,是從Oracle9i引入的。最開(kāi)始進(jìn)行native的初衷就是性能,通常native的PL/SQL代碼要比解釋形式(interpreted form)執(zhí)行速度快。早期的native化是比較費(fèi)力氣的,需要我們提供出本地的編譯器地址。
PL/SQL語(yǔ)句的native過(guò)程需要我們安裝額外的C編譯器,這個(gè)在一些生產(chǎn)環(huán)境下,還是有安全方面的顧慮的。
在9i和10g時(shí)代,數(shù)據(jù)庫(kù)中包括一個(gè)參數(shù)名為plsql_native_library_dir,用于指定本地的編譯器目錄位置。在11g中,這個(gè)參數(shù)被取消,進(jìn)行代碼native的過(guò)程也變得比較簡(jiǎn)單起來(lái)。
在11g中,Oracle是不需要服務(wù)器上額外安裝C編譯器的。Oracle會(huì)直接將需要native化的PL/SQL代碼轉(zhuǎn)化到服務(wù)器上的shared library(DDL)。由此,進(jìn)行PL/SQL的本地編譯就變得很簡(jiǎn)單,只需要一個(gè)開(kāi)關(guān)設(shè)備。這個(gè)就是Oracle參數(shù)plsql_code_type。
在使用native PL/SQL的時(shí)候,我們一定注意使用內(nèi)存對(duì)象的不同。Native PL/SQL代碼對(duì)應(yīng)的機(jī)器碼(machine code)在被調(diào)入數(shù)據(jù)庫(kù)catalog之前,是與PGA內(nèi)存進(jìn)行映射。而解釋代碼(interpreted form code)則是和SGA進(jìn)行對(duì)應(yīng)。所以,在使用native code的時(shí)候,對(duì)SGA的消耗是減少的趨勢(shì)。
2、開(kāi)關(guān)參數(shù)plsql_code_type
從Oracle 11g開(kāi)始,我們可以使用plsql_code_type來(lái)控制編譯器選擇開(kāi)關(guān)。我們選擇Oracle11g進(jìn)行實(shí)驗(yàn)。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 – Production
相關(guān)參數(shù)
SQL> show parameter plsql_code
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
plsql_code_type string INTERPRETED
默認(rèn)情況下,Oracle是選擇解釋代碼的形式進(jìn)行編譯的。通過(guò)視圖user/all/dba_plsql_object_settings,我們是可以看到對(duì)應(yīng)存儲(chǔ)代碼對(duì)象使用的編譯形式的。
首先,我們使用默認(rèn)方式進(jìn)行存儲(chǔ)過(guò)程編譯。
SQL> create or replace procedure P_RECE_CALL_TEST is
2 i number;
3 c number;
4 begin
5 for i in 1..100 loop
6 select count(*) into c from emp;
7 dbms_output.put_line(to_char(c));
8 end loop;
9 end P_RECE_CALL_TEST;
10 /
Procedure created
SQL> select name, plsql_code_type from user_plsql_object_settings;
NAME PLSQL_CODE_TYPE
------------------------------ --------------------
P_RECE_CALL_TEST INTERPRETED
代碼對(duì)象的plsql_code_type列顯示了對(duì)象的編譯形式。我們對(duì)于單獨(dú)的存儲(chǔ)過(guò)程,可以不通過(guò)參數(shù)修改,而是在compile過(guò)程中,直接指定編譯方式。這樣也是可以將代碼編譯為native方式。
SQL> alter procedure p_rece_call_test compile plsql_code_type=native;
Procedure altered
SQL> select name, plsql_code_type from user_plsql_object_settings;
NAME PLSQL_CODE_TYPE
------------------------------ --------------------
P_RECE_CALL_TEST NATIVE
配置參數(shù)plsql_code_type比較簡(jiǎn)單,目前版本Oracle支持Interpreted和Native兩個(gè)選項(xiàng)值。默認(rèn)取值為Interpreted,表示將程序代碼編譯為解析形式。另一個(gè)就是Native,表示編譯為本地代碼。我們可以在session level進(jìn)行靈活的配置。
SQL> alter session set plsql_code_type='native';
Session altered
SQL> alter procedure p_rece_call_test compile;
Procedure altered
SQL> select name, plsql_code_type from user_plsql_object_settings;
NAME PLSQL_CODE_TYPE
------------------------------ --------------------
P_RECE_CALL_TEST NATIVE
重新登錄之后,可以將其編譯回解釋狀態(tài)。
SQL> conn scott/tiger@ora11g;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
Connected as scott
SQL> alter procedure p_rece_call_test compile;
Procedure altered
SQL> select name, plsql_code_type from user_plsql_object_settings;
NAME PLSQL_CODE_TYPE
------------------------------ --------------------
P_RECE_CALL_TEST INTERPRETED
3、性能對(duì)比
PL/SQL本地化代碼最大的好處和優(yōu)勢(shì)就在于性能。特別是11g版本下,本地Native的優(yōu)勢(shì)更加明顯。
我們選擇一個(gè)比較消耗資源的函數(shù)——斐波納妾數(shù)列計(jì)算第n項(xiàng),采用遞歸的結(jié)構(gòu)進(jìn)行計(jì)算。
SQL> create or replace function fib(n number)
2 return number
3 is
4 begin
5 if (n<=2) then
6 return n;
7 else
8 return fib(n-1)+fib(n-2);
9 end if;
10 end;
11 /
Function created
SQL> select name, plsql_code_type from user_plsql_object_settings;
NAME PLSQL_CODE_TYPE
------------------------------ --------------------
FIB INTERPRETED
執(zhí)行實(shí)驗(yàn)前,清理shared_pool和buffer_cache。
SQL> alter system flush shared_pool;
System altered.
SQL> alter system flush buffer_cache;
System altered.
SQL> set timing on;
SQL> set serveroutput on;
SQL> declare
2 n number;
3 begin
4 n := fib(40);
5 dbms_output.put_line('Result is : '||n);
6 end;
7 /
Result is : 165580141
PL/SQL procedure successfully completed
Executed in 43.547 seconds
N=40時(shí)候,PL/SQL解釋形式代碼執(zhí)行時(shí)間43.55s計(jì)算出結(jié)果。下面我們看看Native化之后的情況。
SQL> alter function fib compile plsql_code_type=native;
Function altered
Executed in 0.219 seconds
SQL> select name, plsql_code_type from user_plsql_object_settings;
NAME PLSQL_CODE_TYPE
------------------------------ --------------------
FIB NATIVE
Executed in 0.078 seconds
第二次執(zhí)行相同計(jì)算任務(wù)。
SQL> alter system flush shared_pool;
System altered.
SQL> alter system flush buffer_cache;
System altered.
SQL> set timing on;
SQL> set serveroutput on;
SQL> declare
2 n number;
3 begin
4 n := fib(40);
5 dbms_output.put_line('Result is : '||n);
6 end;
7 /
Result is : 165580141
PL/SQL procedure successfully completed
Executed in 25.734 seconds
第二次native執(zhí)行情況,看出為25.73s完成計(jì)算。性能提升接近一半!
4、結(jié)論
我們?cè)诰帉憄l/sql代碼的時(shí)候,性能是一個(gè)非常重要的考量方式。Native程序化在一定程度上可以提高效率。不過(guò)應(yīng)該看到,Native化程序是有條件的。Native PL/SQL節(jié)省的時(shí)間成本在PL/SQL引擎的層面,而SQL語(yǔ)句引擎方面不會(huì)有很大程度的提升。
所以,如果我們的代碼中以流程、計(jì)算和循環(huán)判斷為主體,SQL語(yǔ)句相對(duì)較少,那么使用Native化是比較“劃算”的。反之,如果主要都是在進(jìn)行SQL語(yǔ)句計(jì)算操作,即使我們將代碼Native化,獲取到的優(yōu)勢(shì)也比較少。
另一方面,Native化的程序在遷移、升級(jí)的時(shí)候,也許會(huì)有很多額外的問(wèn)題和關(guān)注點(diǎn)。也是我們需要注意慎用的方面。
上述就是小編為大家分享的如何進(jìn)行Oracle 11g中的Native PL/SQL代碼編譯了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站名稱:如何進(jìn)行Oracle11g中的NativePL/SQL代碼編譯
鏈接地址:http://www.rwnh.cn/article34/jicipe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、服務(wù)器托管、網(wǎng)站策劃、用戶體驗(yàn)、關(guān)鍵詞優(yōu)化、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)