【Shared Pool】使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared Pool
當系統在載入PL/SQL大物件時,有可能遭遇由於Shared Pool中存在大量碎片導致沒有足夠空間載入的問題。
我們可以將那些經常被使用的PL/SQL大物件預先儲存到Shared Pool中,防止載入失敗以及經常被換出,提高系統執行效率。
1.建立儲存過程初始化測試環境
這裡使用文章《【PL/SQL】向表中插入連續數字之PL/SQL方法》(http://space.itpub.net/519536/viewspace-696181)中提供的方法建立一個簡單的儲存過程用於測試。
注:實際生產環境中,該方法用於儲存PL/SQL大物件,而非本例中給出的樣例儲存過程。
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> create or replace procedure p_insert
2 is
3 begin
4 for i in 1..10 loop
5 insert into t values(i);
6 end loop;
7 commit;
8 end;
9 /
Procedure created.
2.建立DBMS_SHARED_POOL包
系統預設情況下不會建立dbms_shared_pool這個包。我們可以使用dbmspool.sql指令碼進行手工建立。
1)驗證預設情況下DBMS_SHARED_POOL包未建立
sys@ora10g> desc dbms_shared_pool
ERROR:
ORA-04043: object dbms_shared_pool does not exist
2)執行建立DBMS_SHARED_POOL包指令碼
sys@ora10g> @?/rdbms/admin/dbmspool.sql
Package created.
Grant succeeded.
View created.
Package body created.
3)檢視建立成功的DBMS_SHARED_POOL包
sys@ora10g> desc dbms_shared_pool
PROCEDURE ABORTED_REQUEST_THRESHOLD
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
THRESHOLD_SIZE NUMBER IN
PROCEDURE KEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
PROCEDURE SIZES
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MINSIZE NUMBER IN
PROCEDURE UNKEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
我們這裡關注DBMS_SHARED_POOL包中的KEEP和UNKEEP方法。
3.使用DBMS_SHARED_POOL包將儲存過程儲存到Shared Pool
1)確認儲存過程P_INSERT是否被儲存到Shared Pool
可以透過查詢v$db_object_cache檢視獲得這方面的資訊。
sys@ora10g> col owner for a10;
sys@ora10g> col name for a30;
sys@ora10g> col kept for a4
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
最後一列KEPT表明儲存過程P_INSERT此時沒有被儲存到Shared Pool。
2)儲存儲存過程P_INSERT到Shared Pool
由於儲存過程p_insert是建立在sec使用者下,我們可以使用如下方法將該儲存過程儲存到Shared Pool中。
sys@ora10g> exec dbms_shared_pool.keep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
3)在此確認儲存過程P_INSERT是否被儲存到Shared Pool
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE YES
最後一列KEPT表明儲存過程P_INSERT此時已被儲存到Shared Pool。
4.使用DBMS_SHARED_POOL包解除Shared Pool中儲存的儲存過程
我們這裡使用UNKEEP方法可以解除Shared Pool中儲存的儲存過程。
sys@ora10g> exec dbms_shared_pool.unkeep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
解除成功。
5.10g官方文件中關於DBMS_SHARED_POOL包的描述
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_shpool.htm#ARPLS055
6.小結
本文給出了使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared Pool的方法。
DBMS_SHARED_POOL包除了可以實現儲存儲存過程到Shared Pool外,還可以儲存其他資料庫物件,例如SQL語句、Package、Function、Type、Trigger、Sequence等,具體用法和介紹參見官方文件。
Good luck.
secooler
11.05.24
-- The End --
我們可以將那些經常被使用的PL/SQL大物件預先儲存到Shared Pool中,防止載入失敗以及經常被換出,提高系統執行效率。
1.建立儲存過程初始化測試環境
這裡使用文章《【PL/SQL】向表中插入連續數字之PL/SQL方法》(http://space.itpub.net/519536/viewspace-696181)中提供的方法建立一個簡單的儲存過程用於測試。
注:實際生產環境中,該方法用於儲存PL/SQL大物件,而非本例中給出的樣例儲存過程。
sys@ora10g> conn sec/sec
Connected.
sec@ora10g> create or replace procedure p_insert
2 is
3 begin
4 for i in 1..10 loop
5 insert into t values(i);
6 end loop;
7 commit;
8 end;
9 /
Procedure created.
2.建立DBMS_SHARED_POOL包
系統預設情況下不會建立dbms_shared_pool這個包。我們可以使用dbmspool.sql指令碼進行手工建立。
1)驗證預設情況下DBMS_SHARED_POOL包未建立
sys@ora10g> desc dbms_shared_pool
ERROR:
ORA-04043: object dbms_shared_pool does not exist
2)執行建立DBMS_SHARED_POOL包指令碼
sys@ora10g> @?/rdbms/admin/dbmspool.sql
Package created.
Grant succeeded.
View created.
Package body created.
3)檢視建立成功的DBMS_SHARED_POOL包
sys@ora10g> desc dbms_shared_pool
PROCEDURE ABORTED_REQUEST_THRESHOLD
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
THRESHOLD_SIZE NUMBER IN
PROCEDURE KEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
PROCEDURE SIZES
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
MINSIZE NUMBER IN
PROCEDURE UNKEEP
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
NAME VARCHAR2 IN
FLAG CHAR IN DEFAULT
我們這裡關注DBMS_SHARED_POOL包中的KEEP和UNKEEP方法。
3.使用DBMS_SHARED_POOL包將儲存過程儲存到Shared Pool
1)確認儲存過程P_INSERT是否被儲存到Shared Pool
可以透過查詢v$db_object_cache檢視獲得這方面的資訊。
sys@ora10g> col owner for a10;
sys@ora10g> col name for a30;
sys@ora10g> col kept for a4
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
最後一列KEPT表明儲存過程P_INSERT此時沒有被儲存到Shared Pool。
2)儲存儲存過程P_INSERT到Shared Pool
由於儲存過程p_insert是建立在sec使用者下,我們可以使用如下方法將該儲存過程儲存到Shared Pool中。
sys@ora10g> exec dbms_shared_pool.keep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
3)在此確認儲存過程P_INSERT是否被儲存到Shared Pool
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE YES
最後一列KEPT表明儲存過程P_INSERT此時已被儲存到Shared Pool。
4.使用DBMS_SHARED_POOL包解除Shared Pool中儲存的儲存過程
我們這裡使用UNKEEP方法可以解除Shared Pool中儲存的儲存過程。
sys@ora10g> exec dbms_shared_pool.unkeep('SEC.P_INSERT','P');
PL/SQL procedure successfully completed.
sys@ora10g> select owner,name,type,kept from v$db_object_cache where name='P_INSERT';
OWNER NAME TYPE KEPT
---------- ------------------------------ -------------------- ----
SEC P_INSERT PROCEDURE NO
解除成功。
5.10g官方文件中關於DBMS_SHARED_POOL包的描述
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_shpool.htm#ARPLS055
6.小結
本文給出了使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared Pool的方法。
DBMS_SHARED_POOL包除了可以實現儲存儲存過程到Shared Pool外,還可以儲存其他資料庫物件,例如SQL語句、Package、Function、Type、Trigger、Sequence等,具體用法和介紹參見官方文件。
Good luck.
secooler
11.05.24
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-696189/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared PoolSQL物件
- 使用DBMS_SHARED_POOL包將物件固定到共享池物件
- dbms_shared_pool keep物件到share pool中物件
- 安裝DBMS_SHARED_POOL包
- 使用dbms_shared_pool包將物件pin到記憶體中物件記憶體
- Oracle基礎包之DBMS_SHARED_POOL(十)Oracle
- PL/SQL Program Units and the Shared Pool (89)SQL
- 【PL/SQL】在PL/SQL中執行重新整理Shared Pool命令SQL
- shared_pool_spare_free.sqlSQL
- Oracle shared poolOracle
- _shared_pool_reserved_pct or shared_pool_reserved_size with ASMMASM
- Shared Pool 的轉儲與分析
- zt_Oracle shared pool internals_共享池_shared_poolOracle
- 將SYS和SYSTEM的物件都KEEP到shared pool物件
- SHARED POOL總結
- SHARED_POOL解析
- 理解Oracle Shared PoolOracle
- Flush an Object Out The Library Cache [SGA] Using The DBMS_SHARED_POOLObject
- shared_pool的sql命中率SQL
- Oracle Shared Pool Memory ManagementOracle
- ORACLE SGA之shared poolOracle
- SHARED POOL 基礎知識
- 簡單分析shared pool(一)
- 簡單分析shared pool(二)
- 簡單分析shared pool(三)
- Oracle記憶體分配與使用小記(二)Shared Pool and Large PoolOracle記憶體
- ORACLE記憶體管理 之五 SGA variable pool,shared_pool,large_pool,java_poolOracle記憶體Java
- shared pool記憶體結構記憶體
- latch:shared pool的一點理解
- Shared Pool 的基本原理
- oracle優化--shared_pool (3)Oracle優化
- oracle優化--shared_pool (2)Oracle優化
- oracle優化--shared_pool (1)Oracle優化
- SQL在shared pool中的解析過程問題SQL
- 11G can flush one SQL Cursor out of shared poolSQL
- 基於引數shared_pool_reserved_size進一步理解共享池shared pool原理
- SHARED POOL 空閒空間分配流程
- 轉_診斷latch:shared pool等待事件事件