由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語句。