免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

如何進行Oracle11g中的NativePL/SQL代碼編譯

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進行Oracle 11g中的Native PL/SQL代碼編譯,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了懷來免費建站歡迎大家使用!

Oracle環(huán)境中,PL/SQL是我們進行業(yè)務(wù)邏輯實現(xiàn)的最佳手段,同時也是和Oracle數(shù)據(jù)庫本身結(jié)合的最好的語言。使用好PL/SQL本身功能,可以大幅度提高我們的工作效率。

我們從最開始學(xué)習(xí)計算機和編程開始,就接觸到一個概念叫做“二進制程序碼”。計算機可以直接進行二進制代碼的執(zhí)行,就目前而言,二進制是計算機執(zhí)行速度最快的一種形式。其他的高級語言,如C、C++,都是通過編譯Compile和連接Link過程,轉(zhuǎn)化為二進制程序。

二進制程序的特點是執(zhí)行速度快。但是缺點也是明顯的,那就是針對一種物理機器類型(如CPU架構(gòu))、一種操作系統(tǒng),二進制執(zhí)行程序的格式定義都是不同的。所以,針對每一種操作系統(tǒng)和物理平臺,理論上我們都需要進行一遍Compile和Link過程,形成獨特的可執(zhí)行程序。

中立語言,或者稱為中間語言的出現(xiàn),結(jié)束了這樣的局面。這種代表性就是Java和諸多的腳本語言,借助一個“平臺相關(guān)”的虛擬機軟件,我們可以讓相同的代碼在不同平臺上運行。這也就是所謂的“一次編譯,多處執(zhí)行”。

默認(rèn)情況下,PL/SQL代碼就是這樣的中間語言,也可以稱為解釋語言。在不同的平臺上,相同的代碼在運行。相對于Native代碼而言,解析代碼的性能一直是人們關(guān)注的重要問題。將代碼Native本地化,是人們經(jīng)常提到的一種程序優(yōu)化手段。

1、PL/SQL語句Native化

PL/SQL語句的Native化,是從Oracle9i引入的。最開始進行native的初衷就是性能,通常native的PL/SQL代碼要比解釋形式(interpreted form)執(zhí)行速度快。早期的native化是比較費力氣的,需要我們提供出本地的編譯器地址。

PL/SQL語句的native過程需要我們安裝額外的C編譯器,這個在一些生產(chǎn)環(huán)境下,還是有安全方面的顧慮的。

在9i和10g時代,數(shù)據(jù)庫中包括一個參數(shù)名為plsql_native_library_dir,用于指定本地的編譯器目錄位置。在11g中,這個參數(shù)被取消,進行代碼native的過程也變得比較簡單起來。

在11g中,Oracle是不需要服務(wù)器上額外安裝C編譯器的。Oracle會直接將需要native化的PL/SQL代碼轉(zhuǎn)化到服務(wù)器上的shared library(DDL)。由此,進行PL/SQL的本地編譯就變得很簡單,只需要一個開關(guān)設(shè)備。這個就是Oracle參數(shù)plsql_code_type。

在使用native PL/SQL的時候,我們一定注意使用內(nèi)存對象的不同。Native PL/SQL代碼對應(yīng)的機器碼(machine code)在被調(diào)入數(shù)據(jù)庫catalog之前,是與PGA內(nèi)存進行映射。而解釋代碼(interpreted form code)則是和SGA進行對應(yīng)。所以,在使用native code的時候,對SGA的消耗是減少的趨勢。

2、開關(guān)參數(shù)plsql_code_type

從Oracle 11g開始,我們可以使用plsql_code_type來控制編譯器選擇開關(guān)。我們選擇Oracle11g進行實驗。

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是選擇解釋代碼的形式進行編譯的。通過視圖user/all/dba_plsql_object_settings,我們是可以看到對應(yīng)存儲代碼對象使用的編譯形式的。

首先,我們使用默認(rèn)方式進行存儲過程編譯。

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

代碼對象的plsql_code_type列顯示了對象的編譯形式。我們對于單獨的存儲過程,可以不通過參數(shù)修改,而是在compile過程中,直接指定編譯方式。這樣也是可以將代碼編譯為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比較簡單,目前版本Oracle支持Interpreted和Native兩個選項值。默認(rèn)取值為Interpreted,表示將程序代碼編譯為解析形式。另一個就是Native,表示編譯為本地代碼。我們可以在session level進行靈活的配置。

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、性能對比

PL/SQL本地化代碼最大的好處和優(yōu)勢就在于性能。特別是11g版本下,本地Native的優(yōu)勢更加明顯。

我們選擇一個比較消耗資源的函數(shù)——斐波納妾數(shù)列計算第n項,采用遞歸的結(jié)構(gòu)進行計算。

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í)行實驗前,清理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時候,PL/SQL解釋形式代碼執(zhí)行時間43.55s計算出結(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í)行相同計算任務(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完成計算。性能提升接近一半!

4、結(jié)論

我們在編寫pl/sql代碼的時候,性能是一個非常重要的考量方式。Native程序化在一定程度上可以提高效率。不過應(yīng)該看到,Native化程序是有條件的。Native PL/SQL節(jié)省的時間成本在PL/SQL引擎的層面,而SQL語句引擎方面不會有很大程度的提升。

所以,如果我們的代碼中以流程、計算和循環(huán)判斷為主體,SQL語句相對較少,那么使用Native化是比較“劃算”的。反之,如果主要都是在進行SQL語句計算操作,即使我們將代碼Native化,獲取到的優(yōu)勢也比較少。

另一方面,Native化的程序在遷移、升級的時候,也許會有很多額外的問題和關(guān)注點。也是我們需要注意慎用的方面。

上述就是小編為大家分享的如何進行Oracle 11g中的Native PL/SQL代碼編譯了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:如何進行Oracle11g中的NativePL/SQL代碼編譯
鏈接地址:http://m.newbst.com/article34/jicipe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護服務(wù)器托管網(wǎng)站策劃用戶體驗關(guān)鍵詞優(yōu)化電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作