解析Oracle 8i/9i的計劃穩定性(1)

jss001發表於2009-02-10

由Oralce8.1開始,Oracle增加了一個新的特性就是Stored Outlines,或者稱為Plan Stability(計劃穩定性)。這個特性帶來三個好處。首先,你可以最佳化開銷很大的語句的處理。第二,如果有一些語句Oracle需要花費長時間來優 化(而不是執行),你可以節省時間並且減少最佳化階段的競爭。最後,它可以讓你選擇使用新的cursor_sharing引數而無需要擔心因此而不採用最佳化 的執行路徑。

要知道如何使用儲存概要才是最優的,我們首先執行一些極度沒有效率的SQL的儲存過程開始,要注意的是,我們不能修改原始碼(理論上)。

我們將看一下如何跟蹤SQL語句,並且檢視它當前在資料庫中的執行計劃,找出一些提示來改進SQL語句的效能,然後再重新執行該SQL語句時,讓Oracle使用我們的提示。

在這個示例中,我們將建立一個使用者,在該使用者的模式中建一個表格,並且建立一個儲存過程訪問該表格,我們將在這個儲存過程上使用wrap工具,這樣我們就不能透過反向方式得到原始碼。然後我們將透過該儲存過程來除錯SQL的執行。

例子中我們將假定儲存慨要已經在資料庫建立的時候被自動安裝。

準備工作

建立一個使用者,他的許可權有:create session, create table, create procedure, create any outline, and alter session。以該使用者連線並且執行以下的指令碼來建立一個表格:

create table so_demo (

n1 number,

n2 number,

v1 varchar2(10)

)

;

insert into so_demo values (1,1,One);

create index sd_i1 on so_demo(n1);

create index sd_i2 on so_demo(n2);

analyze table so_demo compute statistics;


接著需要編碼來建立一個儲存過程訪問該表格。建立一個稱為c_proc.sql的指令碼,如下:

create or replace procedure get_value (

i_n1 in number,

i_n2 in number,

io_v1 out varchar2

)

as

begin

select v1

into io_v1

from so_demo

where n1 = i_n1

and n2 = i_n2

;

end;

/


當然,也可以直接執行這個指令碼來建立該過程,不過,為了更有效果,轉到作業系統的命令列並且執行以下命令:

wrap iname=c_proc.sql

響應是:Processing c_proc.sql to c_proc.plb

這裡不是透過執行c_proc.sql指令碼來產生該過程,而是執行看不到原始碼的c_proc.plb指令碼,你將會發現在user_source的檢視中找不到我們的SQL語句。[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017126/,如需轉載,請註明出處,否則將追究法律責任。

相關文章