使用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
我們可以將那些經常被使用的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
解除成功。
相關文章
- 【Shared Pool】使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared PoolSQL物件
- 使用DBMS_SHARED_POOL包將物件固定到共享池物件
- 使用dbms_shared_pool包將物件pin到記憶體中物件記憶體
- 安裝DBMS_SHARED_POOL包
- dbms_shared_pool keep物件到share pool中物件
- Oracle基礎包之DBMS_SHARED_POOL(十)Oracle
- PL/SQL Program Units and the Shared Pool (89)SQL
- 【PL/SQL】在PL/SQL中執行重新整理Shared Pool命令SQL
- Flush an Object Out The Library Cache [SGA] Using The DBMS_SHARED_POOLObject
- 將SYS和SYSTEM的物件都KEEP到shared pool物件
- shared_pool_spare_free.sqlSQL
- Shared Pool 的轉儲與分析
- Serverless 使用阿里雲OOS將http檔案轉存到物件儲存Server阿里HTTP物件
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- shared_pool的sql命中率SQL
- PL/SQL 09 包 packageSQLPackage
- PL/SQL 函式 包SQL函式
- 用PL/SQL建立包SQL
- 使用freemarker將echarts圖片儲存到word中Echarts
- Oracle shared poolOracle
- 使用 JDAudioCrawler 將下載的音訊儲存到本地儲存音訊
- _shared_pool_reserved_pct or shared_pool_reserved_size with ASMMASM
- 使用Java將圖片生成sequence file並儲存到HBaseJava
- zt_Oracle shared pool internals_共享池_shared_poolOracle
- javascript如何將檔案儲存到本地JavaScript
- pl/sql中的row物件SQL物件
- 將PL/SQL程式碼封裝在靈巧的包中SQL封裝
- SHARED POOL總結
- SHARED_POOL解析
- 理解Oracle Shared PoolOracle
- SQL在shared pool中的解析過程問題SQL
- 11G can flush one SQL Cursor out of shared poolSQL
- Oracle記憶體分配與使用小記(二)Shared Pool and Large PoolOracle記憶體
- 透過spark將資料儲存到elasticsearchSparkElasticsearch
- Oracle Shared Pool Memory ManagementOracle
- ORACLE SGA之shared poolOracle
- 清除shared pool中某條sql的執行計劃SQL
- 共享SQL區在shared pool中釋放的條件SQL